奇妙的比值
问题描述
明明喜欢钻研各种各样的数学问题。一天,明明对数的因子产生了兴趣,他想把一个数的所有因子都找出来,然后把它们相加再去除以这个数,这样会得到一个比值。明明想看看不同的数的该比值会有什么不同,以便做研究。
例如6这个数,它一共有4个因子,分别是:1、2、3、6,把他们相加然后再除以6,即1+2+3+6=12,12/6=2,就可以得到2这个比值。
明明为了研究,需要得到大量的比值,但是如果通过手动计算比值的话需要花大量的时间,于是明明就想请你帮忙,帮他写一个程序,能够求数的比值。 明明的问题可以归结为:给你一个数,求所有因子和,把这些因子相加,然后再除以这个数,求得比值。
个人总结
1. 数和因子是整型数,而比值可能是小数,因此此题有一个关键就是类型转化。两个int类型的数相除得到的也是int类型没有小数,需要用double()函数,将int类型的数转化为浮点数才能够进行计算
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
int n,sum,i;
double k;
while(cin >> n){
sum = 0;
for(i=1;i<=n;i++){
if(n%i == 0){
sum += i;
}
}
k = double(sum) / double(n);
cout << fixed << setprecision(2) << k << endl;
}
return 0;
}
T的倍数N
问题描述
明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:“明明,你觉得你对数字敏感吗?”明明毫不犹豫地回答:“那当然,非常敏感。”于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。若我现在把自然数T告诉你,你能求出最小的符合条件的自然数N吗?” 明明觉得这个问题很简单,只要按从小到大的顺序把所有是7结尾的自然数找出来,然后交换位置,再除一下,看看倍数是不是T倍就可以了。明明回答爸爸说:“这个问题很简单,来考我吧。”于是明明的爸爸就给了明明一个数字2,让他开始动手寻找。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。他觉得靠手工查找的话,是无法快速找到的。因此,明明求助于你,请你帮他写一个程序,来解决这个相当棘手的问题。但是他也给了你另外一个条件,如果找到超过1000000时还是没有找到需要的那个数的话,就停止寻找。 明明的问题可以归结为:对于一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位,要求这样得到的一个新的数是原数的T倍。现给出这个自然数T,求满足这个要求的最小的自然数N。若在[1, 1000000] 的范围内没有找到N,则输出“No”。
个人总结
直接暴力遍历求解,本题关键点在于
1. 将最后一个数提前,其余位数向后移,这个算法要熟练
2. 有多个答案,需要记录最小值,并且只输出最小值
3. 还有一个关键!倍数的判断不能用 num / num_2 == T 为什么?因为num、num_2,T都是int,即使15/7 = 2.xxxx也是2,不能够用除法判断是否符合条件,否则会有巨多答案。应该用乘法:num*T == num_2 这样判断条件是否符合
4. num.size()输出的固然是这个容器的大小,但是访问的下标是从0到size-1(大小为size)的,所以不能够到达size这个值,取size会溢出(除非用num.end()作为截止)
#include <iostream>
#include <vector>
//#include <set>
//#include <string>
//#include <cmath>
#include <algorithm>
#include <sstream>
//#include <bits/stdc++.h>
using namespace std;
int int_to_string_exchange(int num){
stringstream ss;
int i,j;
ss << num;
string a = ss.str();
string b = "7";
for(i = 0 ;i < a.size() -1;i++){
b += a[i];
}
int expn = 1;
int sum = 0;
for(j = b.size()-1 ;j >= 0 ;j--){
sum += (b[j] - '0')*expn;
expn *= 10;
}
return sum;
}
int main() {
int t;
while(cin >> t){
bool tag = 1;
int min = 1000001;
for(long long i = 1;i <= 1000000;i++){
if(i % 10 == 7){
long long num = i;
long long num_2 = int_to_string_exchange(num);
if( num*t == num_2 && (min > i)){
min = i;
tag = 0;
cout << num << endl;
}
}
}
if(tag){
cout << "No" << endl;
}
}
return 0;
}
三角形
问题描述
“明明,你会用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在循环重复,是这样吗?”“明明真聪明,就是这样。”明明爸爸高兴的说道。于是明明的爸爸给了明明很多组这样的数字,明明也构建出了很多个不同的三角形。
你能像明明那样,写一个程序来构建上面的三角形吗?
个人总结
1. 此题关键在于格式的调整:①如何判定数字后(前)是否要输出“ ”,②如何判断进一行
对于①来说,可以分为数字前输出“ ”:设置一个bool first变量,若为true则前不输出,并改为false,若为false,输出“ ”;数字后输出“ ”:判断是否是最后一个数字,最后一个数字要进一行并输出空格。
2. 若>9,则重新赋值1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
int s,n;
while(cin >> s >> n) {
int i,j;
for(i = 0;i < n;i++){
for(j = 0;j <= i;j++){
if(s <= 9){
cout << s;
if(j != i){
cout << " ";
}
s++;
}
else{
s = 1;
cout << s;
if(j != i){
cout << " ";
}
s++;
}
}
cout << endl;
}
cout << endl;
}
return 0;
}
289



被折叠的 条评论
为什么被折叠?



