zoukankan      html  css  js  c++  java
  • 华为机试练习(二)

    六、

    功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如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的话,末尾总是会多出。

    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;
    	
    }
    

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

  • 相关阅读:
    使用Git进行代码管理的心得
    软件工程的实践项目的自我目标
    第五次作业——团队项目——需求规格说明书
    第三次作业——结对编程
    第六次作业——团队作业
    调研Android平台的开发环境的发展演变
    第四次作业——个人作业——软件案例分析
    IT人士 不能一辈子靠技术生存
    Launchy、FARR、AutoHotKey哪个快速启动软件好?
    申请了好几次,终于通过了!庆祝一下!
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/8676493.html
Copyright © 2011-2022 走看看