华为机试练习(二)
六、
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
详细描述:
函数接口说明:
public String getResult(long ulDataInput)
输入参数:
long ulDataInput:输入的正整数
返回值:
String
1、
#include <iostream> using namespace std; int main(void) { long input; while (cin >> input) { while (input != 1)//最后输出后,input变为了1 { for (int i = 2; i <= input; i++) { if (input % i == 0) { input /= i;//最后输出最大的质数,input变为了1 cout << i << ' '; break; } } } } return 0; }
2、
#include<iostream> #include<string.h> using namespace std; int main() { int n; while(cin>>n) { int flag=1;//利用flag确定是否重新循环 while(flag==1) { for(int i=2;i<(n/2+1);i++) { if(n%i==0) { cout<<i<<" "; n=n/i; flag=1; break; //跳出循环 } else if(i>=n/2) { cout<<n<<" "; flag=0; break; } } } } return 0; }
注意break跳出所有循环,continue 是结束本次循环,开始下次循环。
以上两种解题思路是一个只循环一半,一个是循环所有。
七、
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
输入描述:
输入N个字符,字符在ACSII码范围内。
输出描述:
输出范围在(0~127)字符的个数。
1、
#include<iostream> #include<string.h> using namespace std; int main() { char str[20]; int i,j,n; while(cin>>str) { n=strlen(str); for(i=0;i<n;i++) { if(str[i]>96) cout<<str[i]<<endl; } } return 0; }
只输出了小写字母
2、
#include<iostream> #include<string.h> using namespace std; int main() { char str[]="abc"; int i,n; n=strlen(str); for(i=0;i<n;i++) cout<<int(str[i])<<endl; return 0; }
3、
#include<iostream> #include<string> using namespace std; int main() { string str; while(getline(cin,str)) { int num=0; for(int i=0;i<128;i++) { if(str.find(i)!=string::npos) num++; } cout<<num<<endl; } return 0; }
这题是要求去重复的,所以可以用string.find 函数。注意比较方式 str.find(b)!=string::npos
4、
#include<iostream> #include<string> using namespace std; int main() { int num[128]={0}; int i,n=0; char str; while(cin>>str) { if(str>=0&&str<=127) num[str]=1; } for(i=0;i<128;i++) { if(num[i]==1) n++; } cout<<n<<endl; return 0; }
思路,是放置了128个容器,有的话置1,最后统计1 的次数。
八、
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
1、
#include<iostream> #include<string> #include<cmath>//载入库 using namespace std; int main() { int num;//输入的数 int box[20];//存放拆开了单个数 while(cin>>num) { int i=0,x=0,y=1; while(num!=0)//商为0的时候结束 { y=num%10; num=num/10; for(i=0;i<=x;i++)//x是不重复的个数 { if(box[i]==y) break; } if(i>x) { box[x]=y;//添加到数组中 x++;//个数加1 } } int e=0; for(int j=0;j<x;j++) e=e+box[j]*pow(10,(x-j-1));//因为逆序,所以指数也反着来 cout<<e<<endl; } }
#include<iostream> using namespace std; int main() { int n; int a[10]={0}; int num=0; cin>>n ; while(n) { if(a[n%10]==0) { a[n%10]++;//这一步是更新,遇到下次相同的数会跳过 num=num*10+n%10; } n/=10; } cout<<num<<endl; return 0; }
不重复在这里依旧是装了10个盒子,如果有,就置1,避免重复,免去了每次的比较。
九、
题目描述
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
1、结构体合并
#include<iostream> #include<string> using namespace std; struct Box { int index; int value; } ; int main() { Box Part[1000]; int Box_num,i,j,k; cin>>Box_num; for(i=0;i<Box_num;i++) { cin>>Part[i].index>>Part[i].value;//输入值 } for(i=0;i<Box_num;i++)//合并 { for(j=i+1;j<Box_num;j++) { if(Part[i].index==Part[j].index) { Part[i].value+=Part[j].value; for(k=j;j<Box_num-1;k++) Part[k]=Part[k+1];//统一后移一位 j--;//计数处理 Box_num--; } } } for(int i=0;i<Box_num;i++) { cout<<Part[i].index<<Part[i].value<<endl; } return 0; }
2、
#include<iostream> #include<string> using namespace std; struct Box { int index; int value; } ; int main() { Box Part[1000],box[1000]; int Box_num,i,j,k,x=1;//x是去重复新的结构体的个数 cin>>Box_num; for(i=0;i<Box_num;i++) { cin>>Part[i].index>>Part[i].value;//输入值 } box[0]=Part[0];//新结构体赋初值 for(i=1;i<Box_num;i++)//合并 { for(j=0;j<x;j++) { if(Part[i].index==box[j].index) { box[j].value+=Part[i].value; break; } } if(j>=x)//注意这个if是跳出循环外加的 { box[x]=Part[i]; x++; } } for(int i=0;i<x;i++) { cout<<box[i].index<<" "<<box[i].value<<endl; } return 0; }
3、选择法排序
一定要注意中间量的选取
#include<iostream> #include<string> using namespace std; struct Box { int index; int value; } ; int main() { Box Part[1000]; int Box_num,i,j,k,s; cin>>Box_num; for(i=0;i<Box_num;i++) { cin>>Part[i].index>>Part[i].value;//输入值 } for(i=0;i<Box_num;i++)//合并 { for(j=i+1;j<Box_num;j++) { if(Part[i].index==Part[j].index) { Part[i].value+=Part[j].value; for(k=j;j<Box_num-1;k++) Part[k]=Part[k+1];//统一后移一位 j--; Box_num--; } } } //*****************排序******************** Box temp; for(i=0;i<Box_num-1;i++) { s=i;//最小值的位置 for(j=i+1;j<Box_num;j++) { if(Part[s].index>Part[j].index) { s=j; } } temp=Part[i]; Part[i]=Part[s]; Part[s]=temp; } for(int i=0;i<Box_num;i++) { cout<<Part[i].index<<" "<<Part[i].value<<endl; } return 0; }
就是查重和排序的组合。
4、
#include<iostream> #include<string> using namespace std; struct Box { int index; int value; } ; int main() { Box Part[1000]; int Box_num,i,j,k,s; cin>>Box_num; for(i=0;i<Box_num;i++) { cin>>Part[i].index>>Part[i].value;//输入值 } for(i=0;i<Box_num;i++)//合并 { for(j=i+1;j<Box_num;j++) { if(Part[i].index==Part[j].index) { Part[i].value+=Part[j].value; for(k=j;j<Box_num-1;k++) Part[k]=Part[k+1];//统一后移一位 j--; Box_num--; } } } //*****************排序******************** Box temp; for(i=0;i<Box_num-1;i++) { for(j=0;j<Box_num-1-i;j++) { if(Part[j].index>Part[j+1].index) { temp=Part[j]; Part[j]=Part[j+1]; Part[j+1]=temp; } } } for(int i=0;i<Box_num;i++) { cout<<Part[i].index<<" "<<Part[i].value<<endl; } return 0; }
5、
#include<iostream> #include<string> using namespace std; struct Box { int index; int value; } ; int main() { Box Part[1000],box[1000]; int Box_num,i,j,k,s,x=1; cin>>Box_num; for(i=0;i<Box_num;i++) { cin>>Part[i].index>>Part[i].value;//输入值 } box[0]=Part[0]; for(i=1;i<Box_num;i++)//合并 { for(j=0;j<x;j++) { if(Part[i].index==box[j].index) { box[j].value+=Part[i].value; break; } } if(j>=x) { box[x]=Part[i]; x++; } } //*****************排序******************** Box temp; for(i=0;i<x;i++) { s=i;//最小值的位置 for(j=i+1;j<x;j++) { if(box[s].index>box[j].index) { s=j; } } temp=box[i]; box[i]=box[s]; box[s]=temp; } for(int i=0;i<x;i++) { cout<<box[i].index<<" "<<box[i].value<<endl; } return 0; }
大量数据测试也是正常的,但是在牛客里就不行,崩溃。
十、
题目描述
描述:
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
1、利用string函数
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int n; cin>>n; string str=to_string(n);//转为字符串 reverse(str.begin(),str.end() );//逆序 cout<<str; return 0; }
2、常规求余数
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int n; cin>>n; char temp; if(n==0) { temp=n+'0'; cout<<temp; } while(n) { temp=n%10+'0'; cout<<temp; n=n/10; } return 0; }
注意将数字转为字符的方法。再有并没有将所有数字变为一个字符串,而是单个输出字符。
3、
#include<iostream> #include<string> using namespace std; int main() { int m,n,i=0,j=0; cin>>n; m=n; while(m) { m=m/10; j++; } cout<<j<<endl; char a[j]; while(n) { a[i]=n%10+'0'; n=n/10; i++; } cout<<a; return 0; }
四位数用char的话,末尾总是会多出\0。
4、
#include<iostream> #include<string> using namespace std; int main() { string str; int n; cin>>n; while(n) { str+=n%10+'0'; n=n/10; } cout<<str; return 0; }
4、
#include<iostream> #include<string> using namespace std; int main() { string a,str; int l; cin>>a; l=a.length() ; for(int i=l-1;i>=0;i--) cout<<a[i]; return 0; }
直接按字符串输入和输出。