华为机试练习(二)
六、
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如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;
}
直接按字符串输入和输出。
浙公网安备 33010602011771号