欧几里得

来源:互联网 发布:西厢记赏析网络课答案 编辑:程序博客网 时间:2024/05/17 08:56

欧几里得

时间限制:1000 ms  |  内存限制:65535 KB
难度:0
描述

已知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
n-1就是答案,需要用到大数减1
#include<stdio.h>#include<string.h>char n[100000];int d[100000];int  e[100000];int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",n);        int l;        l=strlen(n);        int sum=0;        int p=0;        memset(e,0,sizeof(e));        memset(d,0,sizeof(d));        if(l==1&&n[0]=='1')        {            printf("0\n");        }        else        {            e[l-1]=1;            for(int i=0; i<l; i++)            {                n[i]=n[i]-48;            }            for(int i=l-1; i>=0; i--)            {                sum=n[i]-e[i];                if(sum<0)                {                    d[p++]=sum+10;                    n[i-1]=n[i-1]-1;                }                else                {                    d[p++]=sum;                }            }            for(int i=p-1; i>=0; i--)            {                if(d[i]!=0)                {                    for(int j=i; j>=0; j--)                    {                        printf("%d",d[j]);                    }                    printf("\n");                    break;                }            }        }    }}

0 0