一级目录
二级目录
三级目录
习题整理
mooc习题
1 10_to_8
不同进制间的转换(30分)
题目内容:
设计一个函数toOcr(int n),实现把输入的一个十进制数转换为八进制数
输入格式:
十进制数。
输出格式:
与之对应的八进制数。
输入样例:
126
输出样例:
176
firstly, my previous 10_to_16 version:
#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;
char arr[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//16(dex)-->0x10 ; 15(dex)-->0x0f;
void to_16(int i)
{
int j=0;
if(i<10)
{
cout<<i;
return ;
}
else
{
j=i%16;
i/=16;
to_16(i);
cout<<arr[j];
}
}
int main()
{
int a;
cin>>a;
to_16(a);
return 0;
}
or:
#include <iostream>
using namespace std;
char arr[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void to_16(int i)
{
int j=0;
if(i!=0)
{
j=i%16;
i/=16;
to_16(i);
cout<<arr[j];
}
else return;
}
int main()
{
int a,b,n;
cin>>a;
to_16(a);
return 0;
}
then, the 10_to_8 version:
just change :
j%=16;
i/=16;
to:
j%=8;
i/=8;
10_to_2 version:
......
without using 递归函数(recursive):
int main ()
{
char translate[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int buf[20];
int n,i=0;
cin>>n;
while(n!=0)
{
buf[i]=n%16;
n/=16;
i++;
}
for(i--;i>=0;i--)
{
cout<<translate[ (buf[i]) ];
}
return 0;
}
2 在给定的数中从右边查找第K位数字
在给定的数中从右边查找第K位数字(30分)
题目内容:
设计一个函数int digit(long n,int k),它返回整数n从右边开始第k个数字的值,若不存在第k个数字则返回-1。
输入格式:
输入两个实参
输出格式:
对应位的数值
输入样例:
输出样例:
my answer:
#include <math.h>
using namespace std;
int digit(long n,int k);
int main ()
{
long n;
cin>>n;
int k;
cin>>k;
cout<< digit(n,k);
return 0;
}
int digit(long n,int k)
{
int i=1,j;
for(j=999;j!=0;i++)
{
j=n/(pow(10,i));
}
if(k>(--i))
return -1;
else
{
for(;k>1;k--)
{
n/=10;
}
return (n%10);
}
}
指针与数组版:
在这里插入代码片
备注:用于求string 长度的方法:
//1:
string a;
cin>>a;
cout<<a.length();
//2:
string a;
cin>>a;
cout<<a.size();
3 找出亲密对数(包括了完数的过程)
题目内容:
求数n之内的亲密对数。所谓“亲密对数”,即A的所有因子(包含1但不包含其本身)之和等于B,而B的所有因子之和等于A。
输入格式:
某个数字n
输出格式:
此数字n之内的亲密对数。
输入样例:
1000
输出样例:
220 284
第一次失误版:(两个因数和factor_sum_???少加了1)
在这里插入代码片
第二次把完数(因数和等于它本身)没有排除:
#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
for(int i=2;i<1000;i++)
{
int factor_sum_fir=0;
for(int e=2;e<sqrt(i);e++) //the thought about acurecy:??
{
if(i%e==0)factor_sum_fir+=( (i/e)+e );
}
factor_sum_fir++;//第一次没有加这一句
int factor_sum_sec=0;
for(int f=2;f<sqrt(factor_sum_fir);f++)
{
if(factor_sum_fir%f==0)factor_sum_sec+=( (factor_sum_fir/f)+f );
}
factor_sum_sec++;
if(i==factor_sum_sec)cout<<"亲密对数:"<<i<<" <->"<<factor_sum_fir<<'\n';
}
return 0;
}
第三次-还未把a<->b, b<->a型重复错误修正:
#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
for(int i=2;i<1000;i++)
{
int factor_sum_fir=0;
for(int e=2;e<sqrt(i);e++) //the thought about acurecy:??
{
if(i%e==0)factor_sum_fir+=( (i/e)+e );
}
factor_sum_fir++;//
int factor_sum_sec=0;
for(int f=2;f<sqrt(factor_sum_fir);f++)
{
if(factor_sum_fir%f==0)factor_sum_sec+=( (factor_sum_fir/f)+f );
}
factor_sum_sec++;//
if(i==factor_sum_sec&&/**/i!=factor_sum_fir)
cout<<"亲密对数:"<<i<<" <->"<<factor_sum_fir<<'\n';
}
return 0;
}
我自己写的功能完整版:
#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
int buf[20]={0};
int num=0;
for(int i=2;i<1000;i++)
{//第一步:
int factor_sum_fir=0;
for(int e=2;e<sqrt(i);e++) //the thought about acurecy:??
{
if(i%e==0)factor_sum_fir+=( (i/e)+e );
}
factor_sum_fir++;//
//第二步:
int factor_sum_sec=0;
for(int f=2;f<sqrt(factor_sum_fir);f++)
{
if(factor_sum_fir%f==0)factor_sum_sec+=( (factor_sum_fir/f)+f );
}
factor_sum_sec++;//
//第三步比对输出:
if(i==factor_sum_sec&&/**/i!=factor_sum_fir)//排除完数
{
int flag=1;
for(int c=0;c<20;c++)//用一个数组存已找到的对数,每次输出前比对一下是否重复
{
if(buf[c]==i||buf[c]==factor_sum_fir)flag=0;
}
if(flag)
{
buf[num]=i;
buf[++num]=factor_sum_fir;
cout<<"亲密对数:"<<i<<" <->"<<factor_sum_fir<<'\n';
}
}
}
return 0;
}
水仙花数
所谓水仙花数(NarcissisticNumber)是指一个3位数,其各位数字的立方和等于它本身。
思路:
(1)将该数各位数字分解出来,然后求各数字立方和是否等于原数
(2)凑3个数字,组成一个三位数,求各数字立方和是否等于凑成的数(注意百位数字从1开始)
例如153是“水仙花数”,因为:153 = 13 + 53 + 33。
在这里插入代码片
完数
题目内容:自然数中,完数寥若晨星,请在从1到1000中打印出所有的完数来。所谓“完数”是指一个数恰好等于它的所有不同因子之和。例如,6是完数,因为6=1+2+3。而24不是完数,因为24≠1+2+3+4+6+8+12(=36)。
输入描述:
输出描述:空格隔开
sqrt()版:
#include <iostream>
using namespace std;
int main ()
{
for(int i=2;i<=1000;i++)
{
int total=0;
for(int e=2;e<sqrt(i);e++)//
{
if(i%e==0)total+=(e+i/e);//
}
if(total+1==i)cout<<i<<endl;
}
return 0;
}
不用sqrt()的费时间版:
#include <iostream>
using namespace std;
int main ()
{
for(int i=2;i<=1000;i++)
{
int total=0;
for(int e=1;e<i;e++)//
{
if(i%e==0)total+=e;//
}
if(total==i)cout<<i<<endl;
}
return 0;
}
课本习题