1、输入一个十进制的数,把它转成八进制。类似的把十进制转成16进制,把十六进制转变为十进制等。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
int main(){
int n;
char s[100];
while(cin>>n){
int cnt=0;
do{
s[cnt++]=n%8+'0';
n/=8;
}while(n);
for(int i=cnt-1;i>=0;i--)
cout<<s[i];
cout<<endl;
}
return 0;
}
2、输入两个非常大的整数(完全超出了int、long的表示范围),这个整数的长度可能超过100位,计算并输出这两个数相加的结果。(HDU acm 1002 用string处理比较好)
思路:
1、使用三个数组,两个存储加上,最后一个存储答案
2、先让位数相同的部分进行运算。每次加的和放进进位d里面, 然后d%10存入数组,d=d/10,更新进位。
3、计算完之后,很可能有一方没有运算完毕,我们将没有运算完毕的数组继续运算。直到都运算完为止
4、按照题目要求格式输出
#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAX 1001
using namespace std;
char a[MAX],b[MAX];
int c[MAX];//用来存储计算的结果
int c_cnt;//记录数组c的长度
int main(){
int n;
int i,j,k;//分别为a,b,c三个数组的指针
cin>>n;
for(int cnt=1;cnt<=n;cnt++){
cin>>a>>b;
int d=0;//初始化进位为0;
for(i=strlen(a)-1,j=strlen(b)-1,k=0;i>=0&&j>=0;i--,j--,k++){
d=a[i]-'0'+b[j]-'0'+d;
c[k]=d%10;//大数的每一位只存模10的余数
d=d/10;//算一下进位是多少
}
while(i>=0&&j<0){//如果a组数据还没有计算 完毕
d=a[i--]-'0'+d;
c[k++]=d%10;
d=d/10;
}
while(j>=0&&i<0){//如果b组数据还没有计算完毕
d=b[j--]-'0'+d;
c[k++]=d%10;
d=d/10;
}
if(d)
c[k++]=d;
cout<<"Case "<<cnt<<":"<<endl;//以下都是控制输出格式
cout<<a<<" + "<<b<<" = ";
for(int i=k-1;i>=0;i--)
cout<<c[i];
cout<<endl;
if(cnt!=n)
cout<<endl;
}
return 0;
}
3、“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<fstream>
#define MAX 1010
using namespace std;
int main(){
char s[MAX];
cin>>s;
bool flag=true;
for(int i=0,j=strlen(s)-1;i<strlen(s)&&j>=i;i++,j--){
//左右各安排一个指针,左边的字符串一直等于右边,那就是回文
if(s[i]!=s[j]){
flag=false;
break;
}
}
if(flag)
cout<<"是回文字符串"<<endl;
else
cout<<"不是回文字符串"<<endl;
return 0;
}
4、输入n个数,按从小到大进行排序并输出。
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
int n, i;
scanf("%d", &n);
int *p = new int[n];
for(i = 0; i < n; ++i)
scanf("%d", &p[i]);
sort(p, p + n);
for(i = 0; i < n; ++i)
printf("%d ", p[i]);
printf("\n");
return 0;
}
5、输入一个长整型的数,从低位起取出奇数位组成一个新的数输出。
#include <stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main(){
long n;
int ans=0,cnt=1,value=1,i=1;//cnt表示答案的第几位,value表示当前该位置的权值
cin>>n;
while(n){
if(i%2){
ans+=n%10*value;
cnt++;
value*=10;
}
n/=10;
i++;
}
cout<<ans<<endl;
return 0;
}
6、输入n个字符串,将它们按字母由小到大的顺序排列并输出。
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
bool cmp(string a ,string b ){
return a<b;
}
int main(){
int n;
cin>>n;
string p[1010];
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
cout<<p[i]<<endl;
return 0;
}
7、输入两个正整数,求出这两个数的最大公约数。
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int gcd(int a,int b){
if(b==0)
return a;//递归出口
else
return gcd(b,a%b);
}
int main(){
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
8、“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3,输入一个整数,判断它是否是水仙花数。
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
bool judge(int num){
int n=num;//n用来最后做判断
int temp[3],i=0,sum=0;
while(num){//这个时候,num会变化,所以最后不能用来做判断。
temp[i++]=num%10;
num/=10;
}
for(int j=0;j<3;j++)
sum+=temp[j]*temp[j]*temp[j];
if(sum==n)
return true;
return false;
}
int main(){
int n;
cin>>n;
if(judge(n))
cout<<"是水仙花数";
else
cout<<"不是水仙花数";
return 0;
}
9、完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。输入一个整数,判断它是否是完数。
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n/2;i++){
if(n%i==0)
sum+=i;
}
if(sum==n)
cout<<"是完数"<<endl;
else
cout<<"不是完数"<<endl;
return 0;
}