如何用c语言解决数字河问题
2017-10-11 22:07
316 查看
Problem G
数字河
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:数字河中的一个数n 的后继数是n 加上其每位数字的和。例如,12345的后继数是12360,因为12345+1+2+3+4+5=12360。如果数字河的第一个数为k,我们就称此数字河为river k。例如,river 480 代表序列{480, 492, 507, 519, ...},river 483 代表序列{483, 498, 519, ...}。
当两个数字河有相同的元素时,我们称这两个数字河在此元素处相遇。例如,river 480 和river 483 在元素519处相遇。所有数字河都会和river 1, river 3 或river 9 相遇。编程计算给定的数字河最先与以上三条河流中的哪一条相遇,在何元素处相遇?
输入:
输入文件包括多组测试用例,每个测试用例占一行,以“0”标志文件结束,该行无需处理。
每行给定一个整数 n ,(1<=n<=16384) ,即river n。
输出:
对于每个测试用例输出两行,第一行为测试用例号,第二行输出“first meets river x at y”。其中,y表示river n 最先遇到的river x中的最小元素值(x = 1,3,9)。
输入样例:
117
52
0
输出样例:
Case #1
first meets river 9 at 117
Case #2
first meets river 1 at 107
#include<stdio.h>
#include<stdlib.h>
#define MAX_TIMES 1200
int *river(int i, int* a);
void meet(int n, int i, int j, int k);
int main()
{
int n, m = 1, i = 1, j = 3, k = 9;
while (1)
// for (n = 1; n < 100; n++)// 可用此循环依次检验整数
{
scanf("%d", &n);
if (0 == n)
break;
printf("Case #%d\n", m);
m++;
meet(n, i, j, k);
}
return 0;
}
int *river(int i, int* a)//数字河函数
{
for (int j = 0; j <= MAX_TIMES; j++)
{
a[j] = i;
i = i + i % 10 + i / 10 % 10 + i / 100 % 10 + i / 1000 % 10 + i / 10000 % 10;
}
return a;
}
void meet(int n, int i, int j, int k)
{//数组的动态内存分配
int *A = (int*)malloc(MAX_TIMES * sizeof(int));
int *B = (int*)malloc(MAX_TIMES * sizeof(int));
int *C = (int*)malloc(MAX_TIMES * sizeof(int));
int *D = (int*)malloc(MAX_TIMES * sizeof(int));
int num = 0;
int a1, b1, c1, d1;
for (int a = 0; a <= MAX_TIMES; a++)
{
for (int b = 0; b <= MAX_TIMES; b++)
{
a1 = river(n, A)[a];
b1 = river(i, B)[b];
c1 = river(j, C)[b];
d1 = river(k, D)[b];
while (a1 > b1 && a1 > c1 && a1 > d1)
{
b++;
b1 = river(i, B)[b];
c1 = river(j, C)[b];
d1 = river(k, D)[b];
}//并列的三个if可节省运算时间
if (a1 == b1)
{
num = a1;
printf("first meets river %d at %d\n", i, num);
break;
}
if (a1 == c1)
{
num = a1;
printf("first meets river %d at %d\n", j, num);
break;
}
if (a1 == d1)
{
num = a1;
printf("first meets river %d at %d\n", k, num);
break;
}
while (a1 < b1 && a1 < c1 && a1 < d1)//此时数字河不能相遇
break;
}
if (num)
break;
}
}
相关文章推荐
- 如何用C语言解决逻辑问题幸运的数字
- mysql如何进行以, -,.分割的字符串的拆分,解决数字字符串分割问题
- 如何解决Windows 8在桌面上总是显示大小写锁定和数字锁定图标的问题
- java jxl导出excel,当数字超过11位变成科学计数法,如何转换成数字问题解决方法
- C语言 — 解决随机函数产生相同数字的问题
- 用C语言解决数字逆序的问题
- 数字货币开发讲解如何使用“双重支付”问题,怎样解决?
- 如何解决xshell中数字键盘不能使用的问题
- C语言中如何解决重复include的问题
- 如何用c语言解决假身份证问题
- 关于c语言中如何解决3n+1,溢出有关问题
- 如何解决JavaScript中UUID作为方法参数在方法中无法传递而数字却正常传递的问题
- 如何解决JavaScript中UUID作为方法参数在方法中无法传递而数字却正常传递的问题
- js里面字符1和数字1相加的结果是11,如何解决这个问题。js里面使用EL表达式。
- 如何去掉鼠标滚轮缩放图片和解决签名图片变形问题。
- 关于如何解决C++ Builder中DBLookupComboBox不能输入的问题:
- 如何用vb的winsocket解决udp文件传送丢包的问题
- 请求帮助:如何解决烦人的VS.NET2003编译时“无法将程序集复制到文件,另一个程序正在使用,进程无法访问”的问题?
- ASP.NET如何解决页面之间传输中文乱码的问题
- 如何解决ASP.NET中中文不能正常显示问题?