oj题目练习
于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有两个整数s和n(1≤s≤
1.奇妙的比值
作者: 孙辞海
时间限制: 10s
章节: 循环
问题描述
明明喜欢钻研各种各样的数学问题。一天,明明对数的因子产生了兴趣,他想把一个数的所有因子都找出来,然后把它们相加再去除以这个数,这样会得到一个比值。明明想看看不同的数的该比值会有什么不同,以便做研究。
例如6这个数,它一共有4个因子,分别是:1、2、3、6,把他们相加然后再除以6,即1+2+3+6=12,12/6=2,就可以得到2这个比值。
明明为了研究,需要得到大量的比值,但是如果通过手动计算比值的话需要花大量的时间,于是明明就想请你帮忙,帮他写一个程序,能够求数的比值。 明明的问题可以归结为:给你一个数,求所有因子和,把这些因子相加,然后再除以这个数,求得比值。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤120),代表所求比值的那个数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个浮点数,就是所求的比值,保留2位小数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。(注:最后求得的比值保留2位小数。) 注:通常,显示屏为标准输出设备。
输入范例
6
10
输出范例
2.00
1.80
个人总结
- 约数求和的核心:
n%i==0判断约数,利用 “约数成对性” 可大幅优化效率; - 类型转换关键:必须先将
int转double再做除法,避免整数除法丢失精度; - 格式化输出:
printf("%.2lf", 变量)是保留两位小数输出double的标准写法;
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int j,k;
int s=0;
double out;
for(int i=1;i<=n;i++){
if(n%i==0)
s=s+i;
}
double s1=(double) s;
double s2=(double) n;
out=s1/s2;
printf("%.2lf",out);
cout<<endl;
}
return 0;
}
2.T的倍数N
作者: 程裕强
时间限制: 10s
章节: 循环
问题描述
明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:“明明,你觉得你对数字敏感吗?”明明毫不犹豫地回答:“那当然,非常敏感。”于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。若我现在把自然数T告诉你,你能求出最小的符合条件的自然数N吗?” 明明觉得这个问题很简单,只要按从小到大的顺序把所有是7结尾的自然数找出来,然后交换位置,再除一下,看看倍数是不是T倍就可以了。明明回答爸爸说:“这个问题很简单,来考我吧。”于是明明的爸爸就给了明明一个数字2,让他开始动手寻找。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。他觉得靠手工查找的话,是无法快速找到的。因此,明明求助于你,请你帮他写一个程序,来解决这个相当棘手的问题。但是他也给了你另外一个条件,如果找到超过1000000时还是没有找到需要的那个数的话,就停止寻找。 明明的问题可以归结为:对于一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位,要求这样得到的一个新的数是原数的T倍。现给出这个自然数T,求满足这个要求的最小的自然数N。若在[1, 1000000] 的范围内没有找到N,则输出“No”。
输入说明
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个自然数T(1≤T≤9)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果输出一个自然数N或“No”,不包括双引号。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
输入范例
5
3
8
输出范例
142857
No
No
个人总结
- 数位操作:通过
%10(取个位)、/10(去个位)、pow(10, n)(构造位数)可实现数字的任意位修改; - 浮点数处理:禁止直接用 == 比较浮点数,需判断差值绝对值小于极小值(如 1e-6);
- 标志位 / 提前终止:查找类问题用 flag 标记状态,找到结果后 break 跳出循环,提升效率;
- 类型转换:
int转double需在除法前完成,避免整数除法丢失精度。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
double T;
while(cin>>T){
if(T==1)
cout<<7<<endl;
else{
int flag=0;
for(int i=1;i<=1000000;i++){
if(i%10==7){
int co=0;
int num=i;
while(num>10){
num=num/10;
co++;
}
int r=7;
for(int j=0;j<co;j++)
r=r*10;
int s=r+i/10;
double s1=(double) s;
double i1=(double) i;
if(s1/i1==T){
cout<<i;
flag=1;
}
}
}
if(flag==0)
cout<<"No";
cout<<endl;
}
}
return 0;
}
3.三角形
作者: ZhuKai
时间限制: 10s
章节: 循环
问题描述
“明明,你会用1到9这九个数字组成一个三角形吗?”明明的爸爸问明明。明明被问的很莫名其妙,不明白他爸爸在说什么,于是就问道:“用1到9组成三角形???”“是的,我的要求很简单,给你2个数,一个数作为这个三角形的开始,另一个数决定这个三角形的大小。例如我给你5和6这两个数,你就要组成如下的一个三角形:
5
6 7
8 9 1
2 3 4 5
6 7 8 9 1
2 3 4 5 6 7
明白了吗?”
明明观察了许久,终于看出了门道来,说道:“就是说给我2个数,例如5和6,那我就要从5这个数开始构建一个三角形。第一行为一个数字,第二行为2个数字,以此类推,直到第六行的六个数字,且三角形中的数字都是1到9在循环重复,是这样吗?”“明明真聪明,就是这样。”明明爸爸高兴的说道。于是明明的爸爸给了明明很多组这样的数字,明明也构建出了很多个不同的三角形。
你能像明明那样,写一个程序来构建上面的三角形吗?
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有两个整数s和n(1≤s≤9,1≤n≤80),其中s表示位于三角形的最顶端的数字,n表示三角形由几行数字组成。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为构建出来的三角形,三角形中的同一行的数字两两之间用一个空格隔开。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。
注:通常,显示屏为标准输出设备。
输入范例
1 5
5 6
输出范例
1
2 3
4 5 6
7 8 9 1
2 3 4 5 6
5
6 7
8 9 1
2 3 4 5
6 7 8 9 1
2 3 4 5 6 7
个人总结
- 多组输出格式控制:用
first标志位避免行首 / 行尾多余换行; - 结构化输出:双层循环控制行列,
j < i判断避免行尾空格; - 1-9 循环公式:
num%9+1是实现 1-9 循环的简洁且严谨的写法;
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int s, n;
bool first = true;
while (cin >> s >> n) {
if (!first) cout << "\n";
first = false;
int num = s;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
cout << num;
if (j < i) cout << " ";
num = num % 9 + 1;
}
cout << "\n";
}
}
return 0;
}
更多推荐



所有评论(0)