吉林大学 中国大学MOOC 高级语言程序设计 第十一讲:程序开发与动态变量--编程题

本人能力有限,发出只为帮助有需要的人。

建议同学们自己写完后再进行讨论。

1自守数(10分)

问题描述:若一个整数a满足条件a*a的尾数等于a则称a为自守数,例如

  25*25=625,76*76=5776, 9376*9376=87909376

都是自守数。编写程序,求n以内所有自守数。

输入:从键盘随机输入一个非负整数作为n值。

输出:输出小于n的所有自守数,每行一个。

样例1:输入

      10   

输出

 1

 5

 6

#include<stdio.h>
long long g(long long x);
int main(void)
{
    long long m,j,a,b,k;//必须用long long才能通过
    long n;
    scanf("%ld",&n);
    printf("1\n");//先输出1以控制格式
    for(k=2;k<n;k++)//从2开始保证没有多的1
    {
    m=k*k;
    a=10000000;//不要用while算a,会超时,题目已给出a的大小
        for(j=a;j>0;j/=10)
        {
        b=m%j;
        if(b==k)
            {
            printf("%ld\n",k);//注意空格
            break;//跳出循环保证不会出现多次一个数
            }
        }
    }
    return 0;
}

2正整数分解(10分)

问题描述:对于正整数n(n<=20),输出其和等于n的所有不增的正整数和式。

输入:从键盘随机输入一个正整数n。

输出:所有和为n的正整数和式,每个和式占一行。

样例1:输入

                   4

输出

    4=3+1

       4=2+2

       4=2+1+1

       4=1+1+1+1

样例2:输入

                 5   

输出

   5=4+1

       5=3+2

       5=3+1+1

       5=2+2+1

       5=2+1+1+1

       5=1+1+1+1+1

#include<stdio.h>
int a[100]={0},n;
int check(int flag);//flag标记拆分的数的下标
void print(int flag);
void split(int x,int flag)
{
    int i,j,k;
    for(i=x-1;i>0;i--)
    {
        j=x-i;
        a[flag]=i;
        a[++flag]=j;
        if(check(flag))
            print(flag);
        if(j>1)
            split(j,flag);//拆分后的数大于一则递归
        flag--;
    }
}
int check(int flag)//检查是否递减
{
    for(int i=0;i<flag;i++)
        if(a[i]<a[i+1])//
            return 0;
    return 1;
}
void print(int flag)
{
    int tem=0;
    printf("%d=",n);
    for(int i=0;i<=flag;i++)
    {
        if(tem)
            printf("+");
        tem=1;
        printf("%d",a[i]);
    }
    printf("\n");
}
int main(void)
{
	scanf("%d",&n);
    split(n,0);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈驰水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值