PTA-暑期学校-Day2(C语言)

1 Cassels方程

Cassels方程是一个在数论界产生了巨大影响的不定方程:x2 + y2 + z2 = 3xyz。该方程有无穷多自然数解。判断给定的一组 (x,y,z) 是不是这个方程的解。

要求:

  1. 输入格式
    输入在第一行给出一个不超过 10 的正整数 N,随后 N 行,每行给出 3 个正整数 0<x≤y≤z≤1000。
  2. 输出格式
    对于每一组输入,如果是一组解,就在一行中输出Yes,否则输出No
  3. 输入样例

2
1 1 1
5 6 7

  1. 输出样例

Yes
No

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int N, x, y, z;
    scanf("%d",&N);
    for (int i=1; i<=N; i++)
    {
    	scanf("%d %d %d\n",&x, &y, &z);
    	int p, q;
    	p = x*x + y*y + z*z;
    	q = 3*x*y*z;
    	if(p==q)
        	printf("Yes\n");
    	else
        	printf("No\n");
    }
    return 0;
}

2 寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

要求:

  1. 输入格式
    输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
  2. 输出格式
    在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。
  3. 输入样例

888 666 123 -233 250 13 250 -222

  1. 输出样例

5

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x, i=1;
    while (1)
    {
    	scanf("%d ",&x);
    	if (x == 250)
        	break;
        i++;
    }
    printf("%d",i);
    return 0;
}

3 分段计算居民水费

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。

要求:

  1. 输入格式
    输入在一行中给出非负实数x。
  2. 输出格式
    在一行输出应交的水费,精确到小数点后2位。
  3. 输入样例1

12

  1. 输出样例1

16.00

  1. 输入样例2

16

  1. 输出样例2

22.50

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    float x;
    scanf("%f",&x);
    float y;
    if (x <= 15)
    {
        y = 4 * x / 3;
        printf("%.2f",y);//%.2f 小数点后2位
    }
    else
    {
        y = 2.5 * x - 17.5;
        printf("%.2f",y);
    }
    return 0;
}

4 强迫症

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写199808,有的人只写9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成年年年年-月月格式。对于那些只写了年份后两位的信息,我们默认小于22都是20开头的,其他都是19开头的。

要求:

  1. 输入格式
    输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。
  2. 输出格式
    在一行中按标准格式年年年年-月月将输入的信息整理输出。
  3. 输入样例1

9808

  1. 输出样例1

1998-08

  1. 输入样例2

0510

  1. 输出样例2

2005-10

  1. 输入样例3

196711

  1. 输出样例3

1967-11

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x, y, m;
    scanf("%d",&x);
    if (x/10000 > 1)
    {
        y = x / 100;
        m = x % 100;
        printf("%02d-%02d",y, m);
    }
    if (x/10000 < 1)
    {
        y = x / 100;
        m = x % 100;
        if (y < 22)
            printf("20%02d-%02d",y, m);
        else
            printf("19%02d-%02d",y, m);   
    }
    return 0;
}

5 最佳情侣身高差

专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

要求:

  1. 输入格式
    输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。
  2. 输出格式
    对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。
  3. 输入样例

2
M 1.75
F 1.8

  1. 输出样例

1.61
1.96

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N;
    scanf("%d",&N);
    char c;
    float h, H;
    for (int i=1; i<=N; i++)
    {
        getchar();
        scanf("%c %f",&c, &h);
        if (c == 'M')
        {
            H = h / 1.09;
            printf("%.2f\n",H);
        }
        else
        {
            H = h * 1.09;
            printf("%.2f\n",H);
        }
    }
    return 0;
}

6 A除以B

给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。

要求:

  1. 输入格式
    输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。
  2. 输出格式
    在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后2位。
  3. 输入样例1

-1 2

  1. 输出样例1

-1/2=-0.50

  1. 输入样例2

1 -3

  1. 输出样例2

1/(-3)=-0.33

  1. 输入样例3

5 0

  1. 输出样例3

5/0=Error

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    float a, b;
    float result;
    scanf("%f %f",&a, &b);
    result = a / b;
    if (y > 0)
        printf("%.0f/%.0f=%.2f",a, b, result);
    if (y == 0)
        printf("%.0f/%.0f=Error",a, b);
    if (y < 0)
        printf("%.0f/(%.0f)=%.2f",a, b, result);
    return 0;
}

7 12-24小时制

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

要求:

  1. 输入格式
    输入在一行中给出带有中间的 : 符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
    提示:在scanf的格式字符串中加入 : ,让scanf来处理这个冒号。
  2. 输出格式
    在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM
  3. 输入样例

21:11

  1. 输出样例

9:11 PM

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int h, m;
    scanf("%d:%d",&h, &m);
    if (0<=h && h<12)
        printf("%d:%d AM",h, m);
    if (h == 12)
        printf("%d:%d PM",h, m);
    if (12<h && h<24)
        printf("%d:%d PM",h-12, m);
    if (h == 24)
        printf("0:%d AM",m);
    return 0;
}

8 计算天数

编写程序计算某年某月某日是该年中的第几天。

要求:

  1. 输入格式
    输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
  2. 输出格式
    在一行输出日期是该年中的第几天。
  3. 输入样例1

2009/03/02

  1. 输出样例1

61

  1. 输入样例2

2000/03/02

  1. 输出样例3

62

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int y, m, d;
    scanf("%d/%d/%d",&y, &m, &d);
    int sum=0, flag=0;
    switch(m)
    {
        case 1: sum=0; break;
        case 2: sum=31; break;
        case 3: sum=59; break;
        case 4: sum=90; break;
        case 5: sum=120; break;
        case 6: sum=151; break;
        case 7: sum=181; break;
        case 8: sum=212; break;
        case 9: sum=243; break;
        case 10: sum=273; break;
        case 11: sum=304; break;
        default: sum=334; break;
    }
    sum += d;
    if ((y%4==0 && y%100!=0) || y%400==0)
        flag=1;
    if (flag==1 && m>2)
        sum++;
    printf("%d",sum);
    return 0;
}

9 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

要求:

  1. 输入格式
    输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过100的正整数(两只手一起划)。

  1. 输出格式
    在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。
  2. 输入样例

1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16

  1. 输出样例

A
1

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int a, b, N, m, n, x, y;
    int sum=0, flag=0;
    scanf("%d %d",&a, &b);
    scanf("%d",&N);
    for (int i=1; i<=N; i++)
    {
        scanf("%d %d %d %d",&m, &n, &x, &y);
        if (m+x==n && m+x!=y)
        {sum++;}
        if (m+x==y && m+x!=n)
        {flag++;}
        if (sum>a && flag<=b)
        {
            printf("A\n"); 
            printf("%d",flag);
            break;
        }
        else if (sum<=a && flag>b)
        {
            printf("B\n"); 
            printf("%d",sum);
            break;
        }
    }
    return 0;
}

10 幸运彩票

彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

要求:

  1. 输入格式
    输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。
  2. 输出格式
    对每张彩票,如果它是幸运的,就在一行中输出You are lucky!;否则输出Wish you good luck.
  3. 输入样例

2
233008
123456

  1. 输出样例

You are lucky!
Wish you good luck.

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N, x, y, z, p, q;
    scanf("%d",&N);
    for (int i=1; i<=N; i++)
    {
        scanf("%d\n",&x);
        y = x / 1000;
        z = x % 1000;
        p = y/100 + (y/10)%10 +y%10;
        q = z/100 + (z/10)%10 +z%10;
        if (p == q)
            printf("You are lucky!\n");
        else
            printf("Wish you good luck.\n");
    }
    return 0;
}

11 找出三位水仙花数

编写程序,输出给定正整数M和N区间内的所有三位水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。

要求:

  1. 输入格式
    输入在一行中给出两个正整数M和N(100≤M≤N≤999)。
  2. 输出格式
    顺序输出M和N区间内所有三位水仙花数,每一行输出一个数。若该区间内没有三位水仙花数,则无输出。如果M或者N不符合题目的要求,则输出Invalid Value.
  3. 输入样例1

100 400

  1. 输出样例1

153
370
371

  1. 输入样例2

500 600

  1. 输出样例2
  1. 输入样例3

990 101

  1. 输出样例3

Invalid Value.

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int M, N;
    scanf("%d %d",&M, &N);
    int x, y;
    int p, q, t;
    x = M;
    if (100<=M && M<=N && N<=999)
    {
        for (x=M; x<=N; x++)
        {
            p = x / 100;
            q = x / 10 % 10;
            t = x % 10;
            y = p*p*p + q*q*q + t*t*t;
            if (x == y)
                printf("%d\n",x);
        }
    }
    else
        printf("Invalid Value.");
    return 0;
}

12 统计字符[2]

编写程序,输入N个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

要求:

  1. 输入格式
    输入在第一行中给出正整数N,第二行输入N个字符,最后一个回车表示输入结束,不算在内。
  2. 输出格式
    在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。请注意,等号的左右各有一个空格,逗号后有一个空格。

  1. 输入样例

10
aZ &
09 Az

  1. 输出样例

letter = 4, blank = 3, digit = 2, other = 1

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int letter=0, blank=0, digit=0, other=0;    
    int N;
    scanf("%d",&N);
    char c;
    scanf("%c",&c);
    for (int i=1; i<=N; i++)
    {
        c = getchar();
        if ((c>='a' && c<='z') || (c>='A' && c<='Z'))
        {letter++;}
        else if (c>='0' && c<='9')
        {digit++;}
        else if (c==' ' || c=='\n')
        {blank++;}
        else
        {other++;}
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter, blank, digit, other);
    return 0;
}

13 求一元二次方程的根

要求一元二次方程ax2 +bx+c=0的根,结果保留2位小数。

要求:

  1. 输入格式
    输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
  2. 输出格式
    根据系数情况,输出不同结果:
    1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
    2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
    3)如果方程只有一个根,则直接输出此根;
    4)如果系数都为0,则输出"Zero Equation";
    5)如果a和b为0,c不为0,则输出"Not An Equation"。
  3. 输入样例1

2.1 8.9 3.5

  1. 输出样例1

-0.44
-3.80

  1. 输入样例2

1 2 3

  1. 输出样例2

-1.00+1.41i
-1.00-1.41i

  1. 输入样例3

0 2 4

  1. 输出样例3

-2.00

  1. 输入样例4

0 0 0

  1. 输出样例4

Zero Equation

  1. 输入样例5

0 0 1

  1. 输出样例5

Not An Equation

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    float a, b, c, d;
    scanf("%f %f %f",&a, &b, &c);
    d = b * b - 4 * a * c;
    float x, x1, x2, real, imag;
    if (a != 0)
    {
        if (d > 0)
        {
            x1 = (-b+sqrt(d)) / (a*2);
            x2 = (-b-sqrt(d)) / (a*2);
            printf("%.2f\n",x1);
            printf("%.2f\n",x2); 
        }
        else if (d < 0)
        {
            if (b != 0)
            {
                real = (-b)*1.0 / (2*a);
                imag = sqrt(-d) / (2*a);
                printf("%.2f%+.2fi\n",real, imag);
                printf("%.2f%+.2fi\n",real, -imag);
            }
            else
            {
                x = sqrt(-d)*1.0 / (2*a);
                printf("%.2f%+.2fi\n",0.0, x);
                printf("%.2f%+.2fi\n",0.0, -x);
            }
        }
        else
            printf("%.2f\n",-b*1.0/(2*a));
    }
	else if (a==0 && b==0 && c==0)
        printf("Zero Equation\n");
    else if (a==0 && b==0 && c!=0)
        printf("Not An Equation\n");
    else if (a==0 && b!=0 && c!=0)
        printf("%.2f\n",(-c*1.0)/b);
    return 0;
}

14 输出GPLT

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT… 这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

要求:

  1. 输入格式
    输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
  2. 输出格式
    在一行中按题目要求输出排序后的字符串。题目保证输出非空。
  3. 输入样例

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

  1. 输出样例

GPLTGPLTGLTGLGLL

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{   
    char c;
    int num, g=0, p=0, l=0, t=0;
    while (scanf("%c",&c) && c!='\n')
    {
        if (c=='G' || c=='g')
            g++;
        if (c=='P'||c=='p')
            p++;
        if (c=='L'||c=='l')
            l++;
        if (c=='T'||c=='t')
            t++;
    }
    while (g>0 || p>0 || l>0 || t>0)
    {
        if (g > 0)
        {
            printf("G");
            g--;
        }
        if (p > 0)
        {
            printf("P");
            p--;
        }
        if (l > 0)
        {
            printf("L");
            l--;
        }
        if (t > 0)
        {
            printf("T");
            t--;
        }
    }
    return 0;
}

15 天梯赛的善良

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。
于是命题组首先将编程能力划分成了 106 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。

要求:

  1. 输入格式
    输入在第一行中给出一个正整数 N(≤2×104),即参赛学生的总数。随后一行给出 N 个不超过 106 的正整数,是参赛学生的能力值。
  2. 输出格式
    第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。
  3. 输入样例

10
86 75 233 888 666 75 886 888 75 666

  1. 输出样例

75 3
888 2

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include <stdio.h>
int main()
{
    int N;
    int a[20000], max=0, min=2000000, sum=0, flag=0;
    scanf("%d",&N);
    for (int i=1; i<=N; i++)
        scanf("%d",&a[i]);
    for (int i=1; i<=N; i++)
    {
        if (a[i] > max)
            max = a[i];
        if (a[i] < min)
             min = a[i];
    }
    for (int i=1; i<=N; i++)
    {
        if (a[i] == max)
            flag++;
        if (a[i] == min)
            sum++;
    }
    printf("%d %d\n",min, sum);
    printf("%d %d",max, flag);
    return 0;
}

16 简单计算器

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

要求:

  1. 输入格式
    输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
  2. 输出格式
    在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
  3. 输入样例

1+2*10-10/2=

  1. 输出样例

10

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x, y, flag=0;
    scanf("%d",&x);
    char c;
    while(1)
    {
        scanf("%c",&c);
        if (c == '=')
            break;
        scanf("%d",&y);
        switch(c)
        {
            case '+': x = x + y;
                break;
            case '-': x = x - y;
                break;
            case '*': x = x * y;
                break;
            case '/':
                if (y == 0)
                    flag = 1;
                else
                    x = x / y;
                break;
            default: flag = 1;   
        }
        if (flag == 1)
            break;
    }
    if (flag == 1)
        printf("ERROR");
    else
	    printf("%d",x);
    return 0;
}

17 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

要求:

  1. 输入格式
    输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 … 给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
  2. 输出格式
    输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
  3. 输入样例1

5
2/5 4/15 1/30 -2/60 8/3

  1. 输出样例1

3 1/3

  1. 输入样例2

2
4/3 2/3

  1. 输出样例2

2

  1. 输入样例3

3
1/3 -1/6 1/8

  1. 输出样例3

7/24

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct fenshu
{
    long x;
    long y;
}f[105], p;
long max(long a,long b);
int main()
{
    int i, N;
    long z=0, l=0;
    scanf("%d",&N);
    scanf("%ld/%ld",&f[0].x, &f[0].y);
    p.x = f[0].x;
    p.y = f[0].y;
    for (i=1; i<N; i++)
    {
        scanf("%ld/%ld",&f[i].x, &f[i].y);
        p.x = p.x*f[i].y + f[i].x*p.y;
        p.y = p.y * f[i].y;   
    }
    if (p.y == 0)
    {
        printf("0");
        return 0;
    }
    if (p.x < 0)
    {
        printf("-");
        p.x = -p.x;
    }
    if (p.x >= p.y)
    {
        z = p.x / p.y;
        p.x = p.x - p.y*z;
        printf("%ld",z);
    }
    if (p.x != 0)
    {
        l = max(p.x,p.y);
        p.x = p.x / l;
        p.y = p.y / l; 
        if (z == 0)
           printf("%ld/%ld",p.x, p.y);
        else
           printf(" %ld/%ld",p.x, p.y);
    }
    if (z==0 && p.x==0)
        printf("0"); 
 return 0;
}
long max(long a, long b)
{
    if (a == 0)
        return b;
    return max(b%a,a);
} 

18 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

要求:

  1. 输入格式
    输入在一行中给出一个正整数 N(1<N<231)。
  2. 输出格式
    首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按因子1* 因子2*……*因子k的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
  3. 输入样例

630

  1. 输出样例

3
567

代码长度限制 16KB
时间限制 400ms
内存限制 64MB

代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int N;
    scanf("%d",&N);
    int t=0, l=0;
    for (int i=2; i<sqrt(N)+1; i++)
    {
        int s=i, g=0, n=N;
        for ( ; n%s==0; g++,s++)
            n = n / s;
        if (g > l)
        {
            t = i;
            l = g;
        }
    }
    if (l != 0)
    {
        printf("%d\n",l);
        for (int i=0; i<l-1; i++)
            printf("%d*",t+i);
        printf("%d",t+l-1);
    }
    else
        printf("1\n%d",N);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值