华为机试练习(二)

六、

功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如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;
	
}

直接按字符串输入和输出。  

 

posted on 2018-03-30 15:30  箬笠蓑衣  阅读(836)  评论(0编辑  收藏  举报