前言
本文是关于编程题目的代码展示和解析,主要讲的就是自守数和返回小于N的质数两道题,会附带链接供大家尝试练习。
自守数
1、自守数是指一个数的平方的尾数等于该数自身的自然数。请求出n(包括n)以内的自守数的个数
例如: 25^2 = 625 , 76^2 = 5776 , 9376^2 = 87909376 。
输入描述:int型整数
输出描述:n以内自守数的数量。
OJ链接【牛客网题号: HJ99 自守数】【难度:中等】
解法1 >设置计数器,每遇到一个++
根据例子发现了个自守数的规律
例如:
25^2=625;625-25=600;600%100=0;25<100;
76^2=5776;5776-76=5700;5700%100=0;76<100;
9376^2=87909376;87909376-9376=87900000;87900000%10000=0;9376<10000;
自守数的平方再减去他本身之后,尾数就只剩下0了,这样求余大于他本身同时又最接近他的十百千万应该等于0
因此只要i从0开始试验,计算(i*i-i)%num是否为0,直到i=n
关键是num的取值,在i>=0&&i<10时num=10,在i<100时num=100,以此类推,在试验之前先判断x的取值
#include<stdio.h>
int main() {
int n = 0;
int cnt = 0;
int num = 10;
scanf("%d", &n);
for (int i = 0; i <= n; i++) {//循环找自守数
if (i >= num) {
num *= 10;//判断x
}
if ((i * i - i) % num == 0) {//判断是否是自守数
cnt++;
}
}
printf("%d", cnt);
}
解法2 >分析得知自守数只有0,末尾为1,5 ,6会出现,统计分析是否为自守数
#include<stdio.h>
int main(){
int n=0;
while(scanf("%d",&n)!=EOF)
{
int ans=0;
for(int i=1;i<=n;i++)
{
if(i%10==1||i%10==5||i%10==6)
//除了0,只有尾数为1 5 6可能是自守数
{
int temp1=i,temp2=i*i;
while(temp1)//验证后几位
{
if(temp2%10!=temp1%10) break; //不相等跳出
temp1/=10; //相等分别除10,比较前一位
temp2/=10;
}
if(temp1==0) ans++;
}
}
printf("%d",ans+1); //带上0
}
return 0;
}
返回小于N的质数
2、返回小于 N 的质数个数
输入描述:一个整数N
输出描述:小于N的质数数量
备注:0、1 不属于质数。
OJ链接【牛客网题号: OR86 返回小于 N 的质数个数】【难度:简单】
#include<stdbool.h>
bool is_prime(int n) {//判断是否是质数
for (int i = 2; i < n; i++) {
//与小于n的数字依次模运算,判断是否有因子
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int n = 0;
int count = 0;
scanf("%d", &n);
for (int i = 2; i < n; i++) {//循环找小于n的质数
if (is_prime(i)) {
count++;
}
}
printf("%d", count);
}
总结
习题到这里就暂时告一段落,代码仅供参考,大家可以尝试点击链接去练习这两道编程题。