如何求得3个一组的五组数字中相同数字的个数?

来源:互联网 发布:双重照片软件 编辑:程序博客网 时间:2024/06/05 05:06

 整理自csdn上的一个帖子。

有5组数字,分别是3位一组,例如578,129,569,175,518这5组数字,要得到如下结果:
1、合并百位重复的数1和5,得到结果5和1,并告知重复数字是2个。若全是百位1的话,则得到结果1,并告知重复数字是1个。
2、全部数字排列后得到578129569175518,合并所有重复的数字得到结果5781296,并告知最后数字是7个。

思路:1、开长度为 10 的整形数组,解析所有百位的数字(如 6、2、2  等),将相应下标的数组值加1,最后统计数组中值  >  1  的个数;
2、将数组中数字连接成字符串保存到一个字符数组中,从最后一个元素开始依次和前面的所有元素比较,如果相等就把该元素以后的所有元素往前依次挪一位,以此实现删除重复元素,最后统计字符数组的长度就是数字个数。

程序:

#include <iostream.h>
#include <string.h>
#include <stdlib.h>

int GetNum1(int a[])
{
 int arr[10]={0};
 int i,tmp,j=0;
 for (i=0;i<5;i++)  
 {
  tmp = a[i]/100;//用百位数做新数组的下标
  arr[tmp] += 1;
 }
 for (i=1;i<=9;i++)
 {
  if (arr[i]>1)
  {
   cout<<"重复的百位数"<<i<<":"<<"重复次数"<<arr[i]<<endl;
   j++;
  }
 }
 return j;
}

int GetNum2(char *str)
{
 int n=strlen(str); 
 int i,j,k;
 
 for(i=n-1; i>0; i--)
 {
        j=0;
  while(j<i)
  {  
   if(str[j]==str[i])
    break;
            j++;
  }  
  if(j<i)
  {  
   k=i;
   while(str[k]!='/0')//去除重复数字,将后面的值依次往前挪一位
   {
    str[k]=str[k+1];
    k++;
   }
  }
 }
 return n=strlen(str);
}

void main()
{
 int a[5] = {578,129,569,175,518};
 char tmp[4];
 char str[15]="";
 int i;
 cout<<"重复百位数个数为:"<<GetNum1(a)<<endl;
 cout<<endl<<"全部数字连接后得到:"<<endl;
 for (i=0;i<sizeof(a)/sizeof(a[0]);i++)
 {
  itoa(a[i],tmp,10);
  strcat(str,tmp);
 }
 cout<<str<<endl;
 cout<<endl<<"出现的数字个数:"<<GetNum2(str)<<endl;
 cout<<"除去重复数字后的序列为:"<<str<<endl;
}

总结:第二问的初解方法:将数组中数字连接成字符串保存到一个字符数组中,从第一个元素开始依次和后面的元素比较,遇到相等的就把其替换为字符‘#’,最后统计数组中非‘#’字符的个数即为数字个数。

程序:

#include <iostream.h>
#include <string.h>
#include <stdlib.h>

int Replace(char str[])
{
 int i,j,count=0;;
 int n=strlen(str);
 for (i=0;i<n;i++)
 {
  for (j=i+1;j<n;j++)
  {
   if (str[i]==str[j])
   {
    str[j]='#';
    continue;
   }
  }
 }
 for (i=0;i<n;i++)
 {
  if (str[i]!='#')
  {
   count++;
  }
 }
 return count;
}

void main()
{
 int a[5] = {578,129,569,175,518};
 char tmp[4];
 char str[15]="";
 int i;
 cout<<endl<<"全部数字连接后得到:"<<endl;
 for (i=0;i<sizeof(a)/sizeof(a[0]);i++)
 {
  itoa(a[i],tmp,10);
  strcat(str,tmp);
 }
 cout<<str<<endl; 
 cout<<endl<<"出现的数字个数为:"<<Replace(str)<<endl;
 cout<<endl<<"将重复数字替换后的序列为:"<<endl;
 cout<<str<<endl;
 cout<<endl<<"除去重复数字后的序列为:"<<endl;
 for (i=0;i<sizeof(str);i++)
 {
  if (str[i]!='#')
  {
   cout<<str[i];
  }
 }
}

以上函数中用到了continue和break,在此做一复习:

break是跳出最近的那层循环,跳出循环后接着执行循环体下面的语句;在GetNum2函数中,当有元素相等时执行break语句跳出while循环,紧接着就执行下面的if语句。

continue是跳出本次循环,跳出循环后又回到循环体头部接着执行后面的循环;在Replace函数中,当i=0,j=6时元素相等,将重复元素替换后执行continue语句跳出循环(如果continue下面有语句不会被执行到),跳出循环后重新回到for循环体头部,接着执行后面的循环,此时i依然等于0,而j加1变成了7,直到j不满足循环条件而结束本次那循环;以此可实现通过一次外层循环就把所有与相比较元素相等的元素都找出来。

原创粉丝点击