BUPT2021秋季计算导论实验五

BUPT2021秋季计算导论实验5

数字拆分

/* 实验3_7_数字拆分 (100 分)
已知一个正整数n,n的范围是1—999999999。你的任务是把这个整数分解为单个数字,然后从左至右依次打印出每一个数字。例如将整数“12345”分解,得到“1 2 3 4 5”。

输入格式:
只有一个正整数。测试用例保证合法。

输出格式:
只有一行,为输入整数的拆分结果,相邻两个数字之间有一个空格,最后一个数字后是换行符。例如12345的拆分结果为:1 2 3 4 5。

输入样例:
12345
输出样例:
1 2 3 4 5*/

#include<stdio.h>
int main()
{
	int n ;
	scanf("%d", &n);
	int cnt=0 ;
	int m = n;
	while (m!= 0)
	    {
	      cnt++;
	      m = m/10 ;
		}
	//printf("%d", cnt );
	int a[9]={0};
	int i ;
	for ( i =0 ; i<cnt ; i++)
	    {
	    	a[i]= n%10;
	    	n = n /10;
		}
	for ( i =cnt-1; i >0 ; i --)//最后输出时,因为要符合pta的输出格式,所以对最后一项单独处理。
		{
			printf("%d ", a[i]);
		}
    printf("%d\n", a[i]);
	return 0;
}

此处我才用了数组,也可以简单点

while(m  >= 10 )
{
    int k  ;
    k = m % 10 ;
    printf("%d " , k ) ;
    m = m / 10 ;
 }
 printf("%d" , m ) ;//每次都将个位数输出

位数对调

*7-2 实验3_8_位数对调 (100 分)
已知一个正整数n(可以用int存储),你的任务是将n的最低位与最高位上的数字对调,次低位与次高位上的数字对调,以此类推,直到中间位。最后得到一个新整数并将新的数字输出。需要注意的是:如果当最低位数字与最高位数字对调后,数字的长度变短(也就是最低位为0),则不能对这个数进行位数对调处理。

输入格式:
只有一个正整数,即n。

输出格式:
当n可以进行数字对调时,例如n=123,你应输出“321”;当n不可以进数字对调时,例如n=980,你应输出“The number cannot be changed.”。

输入样例:
1365
输出样例:
5631*

*#include<stdio.h>
int main()
{
	int n ;
	scanf("%d", &n);
	int cnt = 0;
	int m = n ;
	while (m != 0)
	    { 
	        cnt++; 
	    	m= m /10 ;
		}
	//printf("%d", cnt);
	int i ;
	i=n%10 ;
	if(i ==0 )
	  {
	  	printf("The number cannot be changed.");
	  	return 0;
	  }
	  else 
		{
			int  j = 0;
			int p =0 ;
			int a[cnt]= {0};
			for (;j<cnt ; j++)
			    {
			    	p = n %10;
			    	a[j]= p;
			    	n = n/10;
				}	
			for ( j = 0 ; j <cnt ; j++ )
			    {
			    	printf("%d", a[j]);
				} 
		}
	return 0;
		  
 

符合要求的数字

*7-3 实验3_9_符合要求的数字 (100 分)
已知一个整数n,打印1到n所有除以m后所得商正好是它的各个数字平方和的数。

输入格式:
为两个用空格分隔的整数,它们依次代表n、m(1<m,n<10000)。

输出格式:
按从小到大的顺序依次输出所有满足条件的整数,每个数占一行。测试用例保证有满足条件的数。

输入样例:
1000 11
输出样例:
131
241
324
550
624
803
900
910*

*#include<stdio.h>
int Judge (int , int  );
int main()
{
	int m, n;
	scanf("%d %d", &n,&m);
	int i ;
	for ( i = 1 ; i <= n ; i++ )
		{
			if(Judge(i,m))
			{
				printf("%d\n", i);
			}	
		}
	return 0;
}
int Judge(int  n,int m )
{
	int temp= n;
	int cnt = 0;
	int a[10];
	while ( temp != 0)
	      {
	      	a[cnt++]= temp%10;
	      	temp = temp /10;
		  }
	int yu = n / m;
	int sum = 0;
	int i ;
	for ( i =0 ; i< cnt; i++)
	    {
	    	sum = sum +a[i]*a[i];
		}
	if(sum ==  yu)
	  {
	  	return 1;
	  	
	  }
	  else {
	  	return 0;
	  }
	
}

同构数

实验3_10_同构数 (100 分)
所谓“同构数”是指这样的数,它出现在它的平方数的右边,例如5的平方数是25, 25的平方数是625,所以5和25都是同构数。你的任务是判断整数x是否是同构数。若是同构数,输出“Yes”,否则输出“No”。x的取值范围是(1<=x<=10000),如果输入的x不在允许范围内,则输出错误提示信息“x out of range”。

输入格式:
只有一个整数。测试用例保证所有输入可以用int存储。

输出格式:
只有一行,为判断结果。

输入样例:
20000
输出样例:
20000 out of range

#include<stdio.h>
int main()
{
    int n ;
    scanf("%d", &n);
    int s= n *n;
    int cnt = 0;
    int m = n;
    while (m != 0)
    {
    	cnt++;
    	m = m /10;
	}
    if((n>10000)||(n<1))
        {
      	    printf("%d out of range",n);
	    }
	    else
	    	{
	    		int digit = 1;
	    		int i ;
	    		for ( i = 0; i < cnt ;i++)
	    			{
	    				digit= digit *10;
					}
				int yu= s % digit ;
				if(yu == n )
				  {
				  	printf("Yes");
				  }
				  else 
				  	{
				  		printf("No");
					  }
			}


	return 0 ;
}

鸡兔同笼问题

实验3_11_鸡兔同笼吗? (100 分)
鸡有一个头两条腿,兔子有一个头4条腿,蜻蜓有一个头6条腿。没有例外。一个笼子里共有m个头,n条腿,问鸡、兔和蜻蜓各有多少?

输入格式:
只有一行,为两个正整数m和n,分别代表头的个数和腿的个数数。

输出格式:
有若干行,每一行为一组解,格式均为用空格分隔的三个整数,依次代表鸡的个数、解兔子的个数和蜻蜓的个数。多组解的输出顺序按解鸡的个数小到大排序。 测试数据保证可以用int存储。

输入样例:
15 40
输出样例:
在这里给出相应的输出。例如:

10 5 0
11 3 1
12 1 2

#include<stdio.h>
int main()
{
	int m ,n ;
	scanf("%d %d", &m, &n);
	int head_ji = m /1;;
	int head_tu = m /1;
	int head_qingting = m/1;
	int i , j , k;
	for ( i = 0 ; i <= head_ji; i++)
		{
			for ( j = 0; j <= head_tu ; j++)
		    	{
		    		for ( k = 0; k <= head_qingting ; k ++)
		    			{
		    				if(i + j + k == m)
		    				  {
		    				  	if (2*i + 4*j + 6* k == n )
		    				  		{
		    				  			printf("%d %d %d\n",i , j , k );
									}
							  }
						 } 
				 } 
		}
	return 0;
 } 

上机考试

实验3_12_上机考试 (100 分)
计算导论与程序设计某次上机考试共出了4道题,其中每名同学都至少做对了一道题。根据已知条件求做对了2、3、4题的可能的人数。。

输入格式:
只有一行,为两个用空格分隔的正整数m和n,分别代表参加考试的总人数和总的解题数。

输出格式:
有若干行,每一行为一组解,格式均为用空格分隔的三个整数,依次代表解2题的人数,解3题的人数和解4题的人数。多组解的输出顺序按解2题人数由小到大排序,如果解2题的人数相同则按解3题的人数由小到大排序。所有测试数据保证可以用int存储。

输入样例:
15 20
输出样例:
0 1 1
1 2 0
2 0 1
3 1 0
5 0 0

#include<stdio.h>
int main()
{
	int m , n ;
	scanf("%d %d", &m ,&n);
	int i , j , k;
	int s= n-m;
	for ( i = 0; i <=m ;i ++)
		{
		for ( j = 0; j <= m ; j++)
			{
			for ( k =0 ; k<= m ;k ++)
                {
                   if(i + j + k <= m)
                        {
                           if ( i+2*j+3*k== s)
                               {
                                    printf("%d %d %d\n", i,j,k);
                                }
                        }
                }
			}
		}
	return 0;
}

这次练习应该是算法练习,应该是回溯法和暴力法QAQ…

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

影不在遗忘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值