<C/C++算法>九度OJ题目1151--1200解题练习(五)

题目1151:位操作练习

题目描述:

给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。

循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如:
1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110

输入:

第一行是个整数n, 0 < n < 300000,表示后面还有n行数据
后面是n行,每行有两个不大于65535的非负整数

输出:

对于每一行的两个整数,输出一行,内容为YES或NO

样例输入:
4
2 4
9 18
45057 49158
7 12
样例输出:
YES
YES
YES
NO


题目1153:括号匹配问题

题目描述:

    在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.

输入:

    输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
    注意:cin.getline(str,100)最多只能输入99个字符!

输出:

    对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。

样例输入:
)(rttyy())sss)(
样例输出:
)(rttyy())sss)(
?            ?$

#include "iostream"  
#include "string"  
#include "stack"  
 
using namespace std;
 
void BracketMatch(const string srcStr);
int main()
{
    string str;
    while (cin >> str)
    {
        cout << str << endl;
        BracketMatch(str);
    }
    return 0;
}
 
void BracketMatch(const string srcStr)
{
    stack<int> s;
    string ansStr(srcStr.length(),'0');
    for (unsigned int i = 0; i < srcStr.length(); i++)//从左往右开始遍历  
    {
        if (isalpha(srcStr[i]))
        {
            ansStr[i]=' ';
            continue;
        }
        switch (srcStr[i])
        {
                //对左括号仅作压栈处理,也就是说栈中只可能是左括号  
            case '(':
                if (i != (srcStr.length() - 1))//当是最后一个字符时已经没有必要输出空格了
                    ansStr[i] = ' ';
                s.push(i);//注意,这里
                break;
 
                //对右括号做匹配判断
            case ')':
                if (!s.empty())
                {//如果不为空,说明一定有左括号(实际上是其数组下标)
                    s.pop();
                    ansStr[i] = ' ';
                }
                else//如果为空
                    ansStr[i] = '?';
                break;
 
            default:
                cerr << "错误的括号" << endl;
        }
    }
    while (!s.empty())
    {  //解决多余的左括号  
        ansStr[s.top()] = '$';
        s.pop();
    }
    cout << ansStr << endl;
}
/**************************************************************
    Problem: 1153
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1524 kb
****************************************************************/


题目1156:谁是你的潜在朋友

题目描述:

    “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。
    首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。

输入:

    每个案例第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)

输出:

    每个案例包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)

样例输入:
4  5
2
3
2
1
样例输出:
1
BeiJu
1
BeiJu
#include <iostream>
#include <cstring>
using namespace std;
 
int findK(int key,int A[],int s,int n){
    int count = 1;
    for (int i = s + 1; i < n; i++){
        if (A[i]==key){
            count++;
        }
    }
    return count;
}
 
int pCount[200];
 
int f[1000];
 
int main(){
 
     
    int N, M;
    int key;
    while (cin >> N >> M){
        memset(pCount, 0, 200 * sizeof(int));
        for (int i = 0; i < N; i++){
            cin >> key;
            pCount[key]++;
            f[i] = key;
        }
        for (int i = 0; i < N; i++){
            key = f[i];
            if (pCount[key] == 1)
                cout << "BeiJu" << endl;
            else
                cout << pCount[key]-1<< endl;
        }
    }
 
 
    return 0;
}
/**************************************************************
    Problem: 1156
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1524 kb
****************************************************************/


题目1169:比较奇偶数个数

题目描述:

第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES。

输入:

输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000)。

输出:

如果偶数比奇数多,输出NO,否则输出YES。

样例输入:
5
1 5 2 4 3
样例输出:
YES
#include "vector"
 
#include <iostream>
 
using namespace std;
 
int main()
{
    int n = 0;
    while (cin >> n)
    {
        vector<int> vec(n);
        int count = 0;
        for (int i = 0; i < n; i++)
        {
            cin >> vec[i];
            if (vec[i] % 2 == 1)
                count++;
        }
        if (count < (n - count))
            cout << "NO" << endl;
        else
            cout << "YES" << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1169
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1520 kb
****************************************************************/

题目1170:找最小数

题目描述:

第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x y。输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下y最小的。 

输入:

输入有多组数据。
每组输入n,然后输入n个整数对。

输出:

输出最小的整数对。

样例输入:
5  
3 3  
2 2  
5 5  
2 1  
3 6
样例输出:
2 1
#include <iostream>
#include "algorithm"
 
using namespace std;
 
typedef struct _Point
{
    int x;
    int y;
}Point;
 
bool cmpPoint(Point a, Point b)
{
    if (a.x != b.x)
        return a.x < b.x;
    else
        return a.y<b.y;
}
 
int main(void)
{
    int n = 0;
    while (cin>>n)
    {
        Point w[1000];
        for (size_t i = 0; i < n; i++)
            cin >> w[i].x >> w[i].y;
        //多关键字排序
        sort(w, w + n, cmpPoint);//功能是先排x,若相等则在其基础上对y进行排序。
        //输出最小点
        cout << w[0].x << " " << w[0].y << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1170
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1520 kb
****************************************************************/

题目1180:对称矩阵

题目描述:

输入一个N维矩阵,判断是否对称。

输入:

输入第一行包括一个数:N(1<=N<=100),表示矩阵的维数。
接下来的N行,每行包括N个数,表示N*N矩阵的元素。

输出:

可能有多组测试数据,对于每组数据,
输出"Yes!”表示矩阵为对称矩阵。
输出"No!”表示矩阵不是对称矩阵。

样例输入:
4
16 19 16 6 
19 16 14 5 
16 14 16 3 
6 5 3 16 
2
1 2
3 4
样例输出:
Yes!
No!
#include <iostream>
#include "algorithm"
 
using namespace std;
 
int main()
{
    int n = 0;
    while (cin>>n)
    {
        //vector<vector<int>> array(n);//定义二维数组
        //for (int i = 0; i <n; i++)
        //  array[i].resize(n);//注意:必须设置二维数组的列数,即每一行有多少个元素
        //array[2][1] = 12;//将第三行的第二个元素初始化为12
         
        int **array=new int*[n];
        for (int i = 0; i < n; i++)
            array[i] = new int[n];
 
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cin >> array[i][j];//一行一行获取数据
            }
        }
        bool flag = false;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (array[i][j] != array[j][i])//对称的位置上必须相等
                    flag = true;
            }
            if (flag)
                break;
        }
        if (flag)
            cout << "No!" << endl;
        else
            cout << "Yes!" << endl;
    }
}
/**************************************************************
    Problem: 1180
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:50 ms
    Memory:1916 kb
****************************************************************/

题目1182:统计单词

题目描述:

编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符。
(凡是以一个或多个空格隔开的部分就为一个单词)

输入:

输入包括1行字符串,以“.”结束,字符串中包含多个单词,单词之间以一个或多个空格隔开。

输出:

可能有多组测试数据,对于每组数据,
输出字符串中每个单词包含的字母的个数。

样例输入:
hello how are you.
样例输出:
5 3 3 3
#include "stdio.h"
#include "vector"
#include "string"
#include "iostream"
using namespace std;
 
int main()
{
    string str;
    while (getline(cin,str))
    {
        for (size_t i = 0; i < str.length(); i++)
        {
            int count = 0;
            //while (str[i] <= 'z' && str[i] >= 'a' || str[i] <= 'Z' && str[i] >= 'A')
            while (isalpha(str[i]))
            {//只要是字母就统计
                count++;
                i++;
            }
            if (count)//防止多个空格
            {
                if (i==(str.length()-1))
                    cout << count;
                else
                    cout << count<<" ";
            }
        }
        cout << endl;
    }
    return 0;
}
 
/**************************************************************
    Problem: 1182
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:1520 kb
****************************************************************/


题目1183:守形数

题目描述:

守形数是这样一种整数,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,因此25是一个守形数。
编一个程序,判断N是否为守形数。

输入:

输入包括1个整数N,2<=N<100。

输出:

可能有多组测试数据,对于每组数据,
输出"Yes!”表示N是守形数。
输出"No!”表示N不是守形数。

样例输入:
25
4
样例输出:
Yes!
No!
#include "vector"
#include "string"
#include <iostream>
#include "algorithm"
#include<stdio.h>
using namespace std;
 
int main()
{
    int n, m, f;
    while (scanf("%d", &n) != EOF)
    {
        if(n<2||n>=100) 
            break;
        m = n;
        n = n*n;
        if (n % 1000 == m)
            printf("Yes!\n");
        else if (n % 100 == m) 
            printf("Yes!\n");
        else if (n % 10 == m)  
            printf("Yes!\n");
        else
            printf("No!\n");
    }
 
    return 0;
}
/**************************************************************
    Problem: 1183
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1520 kb
****************************************************************/


题目1184:二叉树遍历

题目描述:

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
ABC##DE#G##F###
其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入:

输入包括1行字符串,长度不超过100。

输出:

可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。

样例输入:
abc##de#g##f###
样例输出:
c b e g d f a 
#include "string"
#include "algorithm"
#include <iostream>
#include "stack"
#include <cmath>
#include <set>

using namespace std;

string preStr;

// 节点定义
class BSTNode
{
public:
	BSTNode()// 默认构造
	{
		pRight = NULL;
		pLeft = NULL;
		value = 0;
	}
	~BSTNode();
	friend class LinkBST;// 允许链表类随意访问节点数据

private:
	char value;
	BSTNode *pRight;
	BSTNode *pLeft;
};

// 无头结点的二叉树定义 
class LinkBST
{
public:
	LinkBST(){};
	~LinkBST(){};

	// 根据字符串重建二叉树
	void ReBuildTree(BSTNode *&pNode, int &index);

	// 中序遍历
	void InOrder(BSTNode *&pRoot);
	
};

// 中序遍历
void LinkBST::InOrder(BSTNode *&pNode)
{
	if (pNode != NULL)
	{
		InOrder(pNode->pLeft);
		cout << pNode->value << " ";
		InOrder(pNode->pRight);
	}
}

// 根据前序字符串重建二叉树
void LinkBST::ReBuildTree(BSTNode *&pNode, int &index)
{
	if (index == preStr.size())
		return;
	if (preStr[index] == '#')
	{
		pNode = NULL;
		index++;
	}
	else
	{
		pNode = new BSTNode;
		pNode->value = preStr[index];
		index++;
		ReBuildTree(pNode->pLeft, index);//总是先建完左子树,再建右子树
		ReBuildTree(pNode->pRight, index);
	}
}


/*
           a
		  / \
         b   #
		/  \
       c    d        <------本例题的二叉树逻辑结构
	  / \  /  \
     #  # e    f
	     / \  / \
		#   g #  #
		   / \
		  #   #
*/


int main()
{
	while (cin >> preStr)
	{
		BSTNode *pRoot = NULL;
		LinkBST bst;
		int index = 0;
		bst.ReBuildTree(pRoot,index);
		bst.InOrder(pRoot);
		cout << endl;
	}
}



题目1185:特殊排序

题目描述:

输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。

输入:
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出:
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入:
4
1 3 4 2
样例输出:
4
1 2 3
提示:

如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。

#include "vector"
#include "string"
#include "algorithm"
#include <iostream>
#include "stack"
 
using namespace std;
 
int main()
{
    int n = 0;
    while (cin >> n)
    {
        vector<int> vec(n);
        if (n >= 2)
        {
            for (int i = 0; i < n; i++)
                cin >> vec[i];
            sort(vec.begin(), vec.end());
            cout << vec[n - 1] << endl;
            for (int i = 0; i < n - 2; i++)
                cout << vec[i] << " ";
            cout << vec[n - 2] << endl;
        }
        else
        {
            int val = 0;
            cin >> val;
            cout << val << endl << -1 << endl;
        }
         
    }
}
/**************************************************************
    Problem: 1185
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:50 ms
    Memory:1520 kb
****************************************************************/

题目1187:最小年龄的3个职工

题目描述:

职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。

输入:

输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。

输出:

可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。

关键字顺序:年龄>工号>姓名,从小到大。

样例输入:
5
501 Jack 6
102 Nathon 100
599 Lily 79
923 Lucy 15
814 Mickle 65
样例输出:
501 Jack 6
923 Lucy 15
814 Mickle 65
#include "string"
#include "algorithm"
#include <iostream>
 
using namespace std;
 
typedef struct _Worker
{
    int num;
    string name;
    int age;
}Worker;
 
bool cmpWorker(Worker x, Worker y)
{
    if (x.age != y.age)
    {
        return x.age < y.age;
    }
    else
    {
        if (x.num != y.num)
            return x.num<y.num;
        else
            return x.age<y.age;
    }
}
 
int main(void)
{
    int n = 0;
    while (cin>>n)
    {
        Worker w[600];
        //Worker *w=new Worker[n];
        for (size_t i = 0; i < n; i++)
            cin >> w[i].num >> w[i].name >> w[i].age;
        //多关键字排序
        sort(w, w + n, cmpWorker);//功能是先排年龄,若相等则在其基础上对工号和姓名进行排序。
        //输出信息
        int min = (n>3) ? 3 : n;
        for (int i = 0; i < min; i++)
            cout << w[i].num << " " << w[i].name << " " << w[i].age << endl;
    }
         
    return 0;
}
/**************************************************************
    Problem: 1187
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:1528 kb
****************************************************************/

题目1189:还是约瑟夫环

题目描述:

生成一个长度为21的数组,依次存入1到21;
建立一个长度为21的单向链表,将上述数组中的数字依次存入链表每个结点中;
将上述链表变为单向封闭(循环)链表;从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;
重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字。

输入:

没有任何输入数据。

输出:

输出上面题目描述中最后剩下的节点中存入的数字。

样例输入:
 
 
样例输出:
 
 
提示:

请不要直接输出数据水过去,这样达不到提升自己的目的,
请按照题目要求来做题,这样到真正考试时才能应对自如。


#include "iostream"
using namespace std;
 
//节点定义
class LinkNode
{
public:
    LinkNode(int item)//有参数的构造
    {//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面  
        next = NULL;
        data = item;
    }
    friend class LinkList;//允许链表类随意访问节点数据
 
private:
    int data;
    LinkNode *next;
};
 
// 带头结点的单链表定义 
class LinkList
{
public:
    //有参数的构造函数  
    LinkList(int size)
    {
        head = new LinkNode(0);//头结点,并未该节点赋值0  
        nLength = 0;
    }
    ~LinkList(){}
    //定位指定的位置,返回该位置上的结点指针  
    LinkNode* Locate(int pos);
    //在指定位置pos插入值为item的结点,失败返回false  
    bool Insert(int item, int pos);
    //创建一个链表环  
    void CreatCircle();
    //数数出局  
    bool CountMove(int nStep = 0, int nPersons = 0);
 
private:
    LinkNode *head;//头结点指针
    int nLength;//统计节点长度,不算头结点
};
 
//返回链表中第pos个元素的地址,第0个元素是头结点
LinkNode* LinkList::Locate(int pos)
{
    LinkNode *p = head;
    int i = 0;
    while (p != NULL && i < pos)//p==NULL说明是末尾了
    {
        p = p->next;
        i++;
    }
 
    return p;
}
 
//在pos位置的节点后面插入新节点并赋值item
bool LinkList::Insert(int item, int pos)
{
    LinkNode *p = Locate(pos);
    LinkNode *newNode = new LinkNode(item);//创建新节点,该节点值为item  
    //建立连接
    newNode->next = p->next;
    p->next = newNode;
    nLength++;
    return true;
}
 
//创建一个链表环 ,将最后一个节点连接第1个节点从而形成环,注意head是第0个节点
void LinkList::CreatCircle()
{
    int nEnd = this->nLength;
    int nStart = 1;
    LinkNode *pTail = Locate(nEnd);
    LinkNode *pcirStart = Locate(nStart);
    pTail->next = pcirStart;
}
 
//从npersons个人中,每数到nstep就出局
bool LinkList::CountMove(int nStep, int nPersons)//指定出局人数  
{
    LinkNode *pCurr = NULL, *pPrev = NULL;
    int i = 0,n = 0;//n统计已经出局的人数
    pCurr = pPrev = head;
    while (n < nPersons)
    {
        pPrev = pCurr;//这三行代码模拟数数
        pCurr = pCurr->next;
        i++;
         
        if (i == nStep)// 此时踢出环 ,删除当前节点并且输出该节点的值
        {   
            pPrev->next = pCurr->next;//重新建立连接
            delete pCurr;
            pCurr = pPrev->next;//指向新位置的下一个节点
            i = 1;
            n++;
        }
 
        if (pPrev == pCurr)//此时最后一个节点
        { 
            cout  << pCurr->data << endl;    
            delete pCurr;
            pCurr = NULL;//最后一个节点删除后的“擦屁股”处理  
            head->next = head;
            n++;
            break;
        }
         
    }
    return true;
}
 
int main()
{
    int nPersons = 21,count = 17;
    LinkList ysf(nPersons);
    for (int i = 0; i < nPersons; i++)
        ysf.Insert(i + 1, i);//在第i个位置插入值为i+1的节点
    ysf.CreatCircle();
    ysf.CountMove(count, nPersons);//数到count出局
     
    return 0;
}
/**************************************************************
    Problem: 1189
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1516 kb
****************************************************************/

题目1192:回文字符串

题目描述:

给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的。

输入:

输入包括一行字符串,其长度不超过1000。

输出:

可能有多组测试数据,对于每组数据,如果是回文字符串则输出"Yes!”,否则输出"No!"。

样例输入:
hellolleh
helloworld
样例输出:
Yes!
No!
#include "string"
#include <iostream>
#include "algorithm"
 
using namespace std;
 
int main()
{
    string str;
    while (getline(cin, str))
    {
        bool flag = false;
        for (int i = 0; i < str.length(); i++)
        {//回文的重要判断依据就是前后对应位置字符必须一样
            if (str[i] != str[str.length() - 1 - i])
            {
                flag = true;
                break;
            }
        }
        if (flag)
            cout << "No!" << endl;
        else
            cout << "Yes!" << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1192
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:40 ms
    Memory:1520 kb
****************************************************************/

题目1193:矩阵转置

题目描述:

输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。

输入:

输入的第一行包括一个整数N,(1<=N<=100),代表矩阵的维数。
接下来的N行每行有N个整数,分别代表矩阵的元素。

输出:

可能有多组测试数据,对于每组数据,将输入的矩阵转置后输出。

样例输入:
3
1 2 3
4 5 6
7 8 9
样例输出:
1 4 7
2 5 8
3 6 9
#include <cstdio>  
#include <cstdlib>  
#include "vector"
#include "string"
#include "algorithm"
#include <iostream>
#include "stack"
#include "math.h"  
 
#define MAXN 100  
using namespace std;
 
 
int main()
{
    int n, i, j;
    int array[MAXN][MAXN];
    while (scanf("%d", &n) != EOF) 
    {
        for (i = 0; i < n; i++) 
        {//获取数据
            for (j = 0; j < n; j++)
                scanf("%d", &array[i][j]);
        }
        for (i = 0; i < n; i++) 
        {//交换array[i][j]和array[j][i]
            for (j = i; j < n; j++) 
            {
                int temp;
                temp = array[i][j];
                array[i][j] = array[j][i];
                array[j][i] = temp;
            }
        }
        for (i = 0; i < n; i++) 
        {
            printf("%d", array[i][0]);
            for (j = 1; j < n; j++)
                printf(" %d", array[i][j]);
            printf("\n");
        }
    }
    return 0;
}
/**************************************************************
    Problem: 1193
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1520 kb
****************************************************************/

题目1194:八进制

题目描述:

输入一个整数,将其转换成八进制数输出。

输入:

输入包括一个整数N(0<=N<=100000)。

输出:

可能有多组测试数据,对于每组数据,
输出N的八进制表示数。

样例输入:
7
8
9
样例输出:
7
10
11
#include "vector"
#include <iostream>
using namespace std;
 
int main()
{
    int n = 0;
    while (cin >> n )
    {
        if (n == 0)
        {
            cout << 0 << endl;
            continue;
        }
        vector<int> vec(100,0);
        int nsize = 0;
        while (n > 0)
        {//获取8进制数,放入数组
            vec[nsize++] = n % 8;
            n = n / 8;
        }
        for (int i = nsize-1; i >= 0; i--)
            cout << vec[i];
        cout << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1194
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:200 ms
    Memory:1520 kb
****************************************************************/

题目1196:成绩排序

题目描述:

用一维数组存储学号和成绩,然后,按成绩排序输出。

输入:

输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

输出:

按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
如果学生的成绩相同,则按照学号的大小进行从小到大排序。

样例输入:
3
1 90
2 87
3 92
样例输出:
2 87
1 90
3 92

#include "vector"
#include<algorithm>
#include <iostream>
 
using namespace std;
 
typedef struct _StuInfo
{
    int num;//学号
    int score;//分数
}StuInfo;
 
bool cmpStu(StuInfo x, StuInfo y)
{
    if (x.score != y.score)
        return x.score < y.score;
    else
    {
        if (x.num != y.num)//如果分数相同则按照学号排名
            return x.num<y.num;
    }
}
 
int main()
{
    StuInfo a[100];
    int n;
    while (cin >> n)//人数
    {
        //获取数据
        for (int i = 0; i<n; i++)
            cin >> a[i].num >> a[i].score;
        //多关键字排序
        sort(a, a + n, cmpStu);//功能是先排分数,若相等则在其基础上对名字和年龄进行排序。
        //输出信息
        for (int i = 0; i<n; i++)
            cout << a[i].num << " " << a[i].score << endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1196
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:470 ms
    Memory:1520 kb
****************************************************************/

题目1198:a+b

题目描述:

实现一个加法器,使其能够输出a+b的值。

输入:

输入包括两个数a和b,其中a和b的位数不超过1000位。

输出:

可能有多组测试数据,对于每组数据,
输出a+b的值。

样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
#include "vector"
#include "string"
#include <iostream>
#include "algorithm"
 
#define N 1010
int len = 1001;
using namespace std;
 
void AddBigNum(const string &a, const string &b, vector<int> &ansStr);
int main()
{
    string bigNum1, bigNum2;     // 初始状态用string来存储大数 
     
    while (cin >> bigNum1 >> bigNum2)
    {
        int c = max(bigNum1.size(),bigNum2.size());
        vector<int> ans(len, 0);//接收答案
        AddBigNum(bigNum1, bigNum2, ans);//执行大整数加法
        if (ans[0] != 0) //看看最高位是否有进位
            for (int i = 0; i <= c; i++)
                cout << ans[i];
        else
            for (int i = 1; i <= c; i++)
                cout << ans[i];
        cout << endl;
        ans.clear();
    }
    return 0;
}
 
 
void AddBigNum(const string &a, const string &b, vector<int> &ans)
{
    int length1=a.size(), length2=b.size();
    vector<int> anum(len,0),bnum(len,0);
    int k = max(a.size(), b.size());
    int c = k;
    //按照字符串中的数据顺序转换成整数
    for (int i = 0; i<length1; k--, i++) //低位放在数组的前面,比如523,a[3]=3,a[2]=2,a[1]=5
        anum[k] = a[length1 - 1 - i] - '0';
 
    for (int i = 0, k = c; i<length2; k--, i++) //低位放在数组的前面,比如19,b[3]=9,b[2]=1,b[1]=0
        bnum[k] = b[length2 - 1 - i] - '0';
 
    //作位相加
    for (int i = c; i>0; i--)
        ans[i] = anum[i] + bnum[i];//ans[3]=12,ans[2]=3,ans[1]=5
     
    //进位,低位向高位进位
    for (int i = c; i>0; i--)
    {
        if (ans[i] >= 10)
        {//ans[i-1]是高位,ans[i]是低位
            ans[i - 1] += ans[i] / 10;
            ans[i] = ans[i] % 10;
        }
    }
}
/**************************************************************
    Problem: 1198
    User: EbowTang
    Language: C++
    Result: Accepted
    Time:150 ms
    Memory:1520 kb
****************************************************************/




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值