Submit: 6303 Solved: 1979
[Submit][Status][Web Board]
Description
输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n<k<100,且m与n不相等。
Input
输入三个整数,依次为k、m、 n。
Output
从小到大输出符合题意的所有整数,两数之间用一个空格分开。
Sample Input
15 2 3
Sample Output
2 3 4 8 9 10 14 15
HINT
难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。
#include <iterator>
#include <iostream>
#include <list>
using namespace std;
// 输入K,M,N 输出结果
void showbei(int k,int m,int n)
{
list<int> mbei; //定义一个mbei的链表,用于存储m的倍数
list<int> nbei; //定义一个nbei的链表,用于存储n的倍数
//求倍数从i=2倍开始递增,
int i=2,t;
t=m;
while(k>=t)
{
mbei.push_back(t); //M的倍数t 存储到链表mbei中
t=m*i;
i++;
}
i=2;
t=n;
while(k>=t)
{
nbei.push_back(t); //N的倍数t 存储到链表nbei中
t=n*i;
i++;
}
//定义两个迭代器 用于遍历 【M、N】两个链表
list<int>::iterator mib,mie;
list<int>::iterator nib,nie;
mie=mbei.end();
nie=nbei.end();
cout<<endl<<endl;
for (mib=mbei.begin();mib!=mie;mib++)
{
cout<<*mib<<" "; //遍历打印出 M 的倍数
}
cout<<endl<<endl;
for (nib=nbei.begin();nib!=nie;nib++)
{
cout<<*nib<<" "; //遍历打印出 N 的倍数
}
cout<<endl<<endl;
for (mib=mbei.begin();mib!=mie;mib++)
{
for (nib=nbei.begin();nib!=nie;nib++)
{
if ((*mib)==(*nib)) //如果两个值相等 两个链表都把该值删除
{
mib=mbei.erase(mib);
nib=nbei.erase(nib);
goto over; //删除后通过goto语句跳出内循环,进 // 行外循环,一直遍历下去。
}
}
over:
; //注意分号 【;】
}
cout<<endl<<endl;
mbei.merge(nbei); //归并两个链表mbei,nbei 到mbei中
mbei.sort(); //对mbei 进行排序
for (mib=mbei.begin();mib!=mie;mib++)
{
cout<<*mib<<" "; //打印出排序后的值
}
cout<<endl;
}
void main()
{
int k=0,m=0,n=0;
scanf("%d",&k);
scanf("%d",&m);
scanf("%d",&n);
showbei(k,m,n);
system("pause");
}