欧几里得
时间限制:
1000 ms
-
描述
-
已知gcd(a,b)表示a,b的最大公约数。
现在给你一个整数n,你的任务是在区间[1,n)里面找到一个最大的x,使得gcd(x,n)等于1。
-
输入
-
输入文件的第一行是一个正整数T,表示有T组测试数据
接下来有T行,每行有一个正整数n (1<=n<=10^1000)。
输出
- 每组测试输出要求x。 样例输入
-
2 4 7
样例输出
-
3 6
-
-
题目大意: 在1--n中找一个最大的数x,让x与n的最大公约数为1
-
-
思路: 很明显n-1就是需要找的x,比如:n=10,x就是9;n=45,x=44;.....
-
看到这也许你想动手开始写程序了(又或者和我思路一样,代码已经码好,可是WrongAnswer),别急,往下看。
-
注意:数据范围 (1<=n<=10^1000),这个1要特别注意,如果按x=n-1,那此时x=0,明显错了,所以1为特殊数据,n=1时,答案应该是1;
-
10^1000, 足足1000位数,容易想到用字符串存,然后就是-1,输出,就行了。
-
-
再给几组测试数据:
-
3
-
1
-
1000000000000000000000000
-
1234567890
-
-
输出
-
1
-
999999999999999999999999
-
1234567889
-
-
AC代码:
-
#include <stdio.h> #include <string.h> int main() { int t, i, l; char s[2000]; scanf("%d", &t); while(t--) { scanf("%s", s); l = strlen(s); if(l == 1 && s[0] == '1') printf("1\n"); else { for(i = l-1; i >= 0; i--) { if(s[i] == '0') s[i] = '9'; else { s[i] -= 1; break; } } i = 0; while(s[i] == '0') i++; for(i; i < l; i++) printf("%c",s[i]); printf("\n"); } } return 0; }
-
输入文件的第一行是一个正整数T,表示有T组测试数据