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



题目详情:

如果两个正整数组成它们的数字和相同则称它们互为友好数,给定正整数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;
			}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值