您的位置:首页 > 其它

高校俱乐部之友好数(1)

2014-02-01 22:33 155 查看


题目详情:

如果两个正整数组成它们的数字和相同则称它们互为友好数,给定正整数x,求比它大的最小的友好数。

例如x = 222, 输出231,因为2 + 2 + 2 = 6 = 2 + 3 + 1。

输入一个正整数x,由于输入数字较大,我们用字符串作为输入,字符串不包含首'0'。 (0 < x <= 10^1000)

我们同样用字符串来表示输出。

分析:面对这道题,首先考虑到的问题应该是这个最小的友好数有什么规则。好,在这里我就说一下我的思路吧!下面是一些例子:

x=222,y=231

x=1,y=10

x=100,y=1000

x=520,y=601

x=65200000,y=66000001

从以上例子中我们可以看出有四类数:

(一)只有一位的数x,那么友好数为10+x-1;

(二)最右边没有0(或者说不能被10整除的),那么友好数为x+10-1;

(三)最右边有n个0,右边算起的第n+1个数b,那么友好数为x+10^n-b+1.

(四)数x只有最左边一位是非零a,那么友好数为10^(n+1)+a-1

下面是还没有化的算法,会超时。

char *friend(char* s)
{
int len = strlen(s);
char *sr = (char *)malloc(1001);
int j, jw = 0, i = len;
memset(sr, 0, sizeof(sr));
while (s[--i] == '0'){}
if (i == 0 && len == 1)
{
sr[0] = '1';
sr[1] = s[0] - 1;
}
else
{
if (i == len - 1)
{
s[len - 2] = s[len - 2] + 1;
s[len - 1] = s[len - 1] - 1;
for (j = len - 2, jw = 0; j >= 0; j--)
{
s[j] = s[j] + jw;
jw = 0;
if (s[j]>'9')
{
s[j] = s[j] - 9;
jw = 1;
}
else
{
break;
}
}
}
else if (i>0 && i<len - 1)
{
s[i - 1] = s[i - 1] + 1;
s[i] = '0';
s[len - 1] = '1';
for (j = i - 1, jw = 0; j >= 0; j--)
{
s[j] = s[j] + jw;
jw = 0;
if (s[j]>'9')
{
s[j] = s[j] - 9;
jw = 1;
}
else
{
break;
}
}
}
else
{
sr[0] = '1';
s[len - 1] = s[0] - 1;
s[0] = '0';
jw = 1;
}
if (jw == 1)
{
sr[0] = '1';
sr = strcat(sr, s);
}
else
{
sr[0] = '0';
sr = strcat(sr, s);
sr++;
}
}
return sr;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: