输出是m的倍数或n的倍数、但不是m和n的公倍数的数

//----------------------【夜语蝉鸣】----------------------
Problem F: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
Time Limit: 1 Sec  Memory Limit: 2 MB
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");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值