数学问题

1.问题 A: 守形数

题目描述

守形数是这样一种整数,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,因此25是一个守形数。
编一个程序,判断N是否为守形数。

输入

输入包括1个整数N,2<=N<100。

输出

可能有多组测试数据,对于每组数据,
输出”Yes!”表示N是守形数。
输出”No!”表示N不是守形数。

样例输入

6
11

样例输出

Yes!
No!

分析:

依次比较平方数和给定数的个位,十位,百位,直到给定数的余数为0的时候,就可以判定其为守形数。

代码:

#include <stdio.h>
int main(){
	int m,i;
	while(scanf("%d",&m)!=EOF){
		int a=m*m;
		while(m){
			if(a%10!=m%10){
				printf("No!\n");
				break;
			}
			a/=10;
			m/=10;
		}
		if(!m){
			printf("Yes!\n");
		}
	}
	return 0;
}

思路:

首先判断两个数的个位,不同立即输出不是守形数,然后更新变量,对十位、百位进行比较,直到余数为0时,说明已经比较完成。

 

二 问题 B: 反序数

题目描述

设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)
求N的值

输入

程序无任何输入数据。

输出

输出题目要求的四位数,如果结果有多组,则每组结果之间以回车隔开。

 

分析:

直接通过取余以及求商来对数进行处理

代码:

#include<cstdio>
int main(){
	for(int n=1000;n<10000;n++){
		int i=n%10*1000+n/10%10*100+n/100%10*10+n/1000;
		if(i==9*n)
			printf("%d\n",n);
	}
	
}

 

3.问题 E: 众数

题目描述

输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。

输入

测试数据有多组,每组输入20个1-10之间的数。

输出

对于每组输入,请输出1-10中的众数。

注意如果存在一样多次数的众数,则输出权值较小的那一个。

样例输入

8 9 6 4 6 3 10 4 7 4 2 9 1 6 5 6 2 2 3 8

样例输出

6

分析:

考虑使用散列,即将输入的数字存在对应数组中,用数组的值来存储该数的个数,然后比较大小,取出其中的最大值,注意当几个数的个数相同的时候,取出数值最小的那个数。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int a[20];
int main(){
	while(scanf("%d",&a[0]) !=EOF){
		int b[20]={0};
		b[a[0]]++;
		for(int i=1;i<20;i++){
			scanf("%d",&a[i]);
			b[a[i]]++;
		}
		int max=b[0];
		int c=0;;
		for(int i=1;i<11;i++){
			if(b[i]>max){
				c=i;
				max=b[i];
			}
			else if(max==b[i]) {
				if(i<c)
					c=i;
			}
		}
		printf("%d\n",c);
	}
		
}

思路:

b[a[i]]++即把某一个数的个数存储到数组中,用数组的下标表示该数,

else if(max==b[i]) {
if(i<c)
c=i;
}

上面的代码为,当两个数字的个数相同时,取出其中的小的数字

需要注意的是:由于要输入多组数据,因此每次都需要对存放数字个数的数组进行初始化,不然程序不对,下一次输入数据时,其个数是在上一次的基础上添加的。

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/weixin_43511126/article/details/88426313
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞