UVa10038 Jolly Jumpers

有n個整數的序列我們稱為jolly jumper,如果相鄰的2個數其差的絕對值恰好為1到n-1。
例如:1 4 2 3 就是jolly jumper(n=4)。因為相鄰2數的差的絕對值為3,2,1,就是1到n-1。
但是 1 4 2 -1 6 不是jolly jumper(n=5)。因為相鄰2數的差的絕對值為3,2,3,7,並非1到n-1。

你的任務是寫一個程式來判斷一個整數序列是否為jolly jumper。

Input

每組測試資料一列,第一個正整數為 n(n <= 3000),代表此整數序列的長度。接下來有n個整數,代表此整數序列。請參考Sample Input。

Output

對每一組測試資料,輸出此整數序列是否為jolly jumper。請參考Sample Output。

Sample Input

4 1 4 2 3
5 1 4 2 -1 6

Sample Output

Jolly
Not jolly
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n;
    while (~scanf("%d", &n)){
        int array[3001] = {};
        int str[3001] = {};

        for (int i = 0; i < n; i++)
            scanf("%d", &array[i]);

        for (int i = 0; i < n - 1; i++)
            str[abs(array[i] - array[i+1])] = true;

        int count = 1;
        for (int i = 1; i <= n - 1; i++)
            if (str[i]) count ++;

        if (count == n - 1) printf("Jolly\n");
        else printf("Not jolly\n");
    }
}

 

UVa 488 Triangle Wave

题目大意:
给你振幅和频率,让你画出波形。
如:

3
2

波形为:

1
22
333
22
1

1
22
333
22
1

#include <iostream>
using namespace std;
void print(int a, int b);

int main()
{
    int n, leap, a, b;
    cin >> n;
    leap = 0;
    
    while(n--){
        if (leap != 0)
        //    cout << "CR"<<endl;
        cout << endl;

        leap++;
        cin >> a >> b;
        print(a, b);
    }
}

//a为振幅,b为频率
void print(int a, int b)
{
    for (int i = 0; i < b; i++){ //一共打印b个波浪

        for (int j = 1; j < a; j++){   //打印波峰之前
            for (int k = 1; k <= j; k++){  //打印每行
                cout << j;
            }
            cout << endl;
    }


        for (int j = 1; j <= a; j++){ //打印波峰
            cout << a;
        }

        for (int j = a - 1; j >= 1; j--){ //打印波峰之后
            for (int k = 1; k <= j; k++ ){ //打印每行
                cout << j;
            }
            cout << endl;
        }
        if(i != b - 1)
        //    cout << "LF" << endl;
        cout << endl;
    }
}

 

[演算法笔记] 打印直角三角形

#include <iostream>
using namespace std;

void print_line ( int n)
{
    for (int i = 1; i <= n; i++){
        cout << '@' ;
    }
        cout <<  endl;
}

void print_triangle(int n)
{
    for (int i = n; i >= 1; i--){
        print_line(i);
    }
}

 

[演算法笔记] 选择排序

#include <stdio.h>

int slection_sort(int array[], int n)
{
    for (int i = 0; i < n; i++){
        int min_index = i;
        for (int j = i + 1; j < n; j++)
            if (array[j] < array[min_index]){
                min_index = j;
            }
        swap(array[i], array[min_index]);
    }
}

 

gdb调试工具常用命令

编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main

gdb中命令:

回车键:重复上一命令

(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r
(gdb)start:单步执行,运行程序,停在第一执行语句
(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l
(gdb)set:设置变量的值
(gdb)next:单步调试(逐过程,函数直接执行),简写n
(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s
(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt
(gdb)frame:切换函数的栈帧,简写f
(gdb)info:查看函数内部局部变量的数值,简写i
(gdb)finish:结束当前函数,返回到函数调用点
(gdb)continue:继续运行,简写c
(gdb)print:打印值及地址,简写p
(gdb)quit:退出gdb,简写q

 

(gdb)break+num:在第num行设置断点,简写b
(gdb)info breakpoints:查看当前设置的所有断点
(gdb)delete breakpoints num:删除第num个断点,简写d
(gdb)display:追踪查看具体变量值
(gdb)undisplay:取消追踪观察变量
(gdb)watch:被设置观察点的变量发生修改时,打印显示
(gdb)i watch:显示观察点
(gdb)enable breakpoints:启用断点
(gdb)disable breakpoints:禁用断点
(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元
(gdb)run argv[1] argv[2]:调试时命令行传参
(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())
core文件:先用$ ulimit -c 1024 开启core,当程序出错会自动生成core文件。调试时 gdb a.out core

 

ctrl+c:退出输入

shell脚本将gbk文件转化为utf-8

#!/bin/bash
function gbk2utf(){
    file="$1"
    echo "处理文件 '$file' ..."
    iconv -f gbk -t UTF-8 -c "$file" > tmp 
    mv -f tmp "$file"
}
 
function getdir(){
    for element in `ls $1`
    do  
        dir_or_file=$1"/"$element
        echo $dir_or_file
        if [ -d $dir_or_file ]
        then
            getdir $dir_or_file
        else
            gbk2utf $dir_or_file
        fi  
    done
}
getdir $1<span>	</span>

 

ECNU OJ 2876 二进制位不同的个数

对于两个非负整数 x 和 y,函数 f(x,y) 定义为 x 和 y 在二进制表示时,其对应位不同的个数。例如,f(2,3)=1, f(0,3)=2, f(5,10)=4。

现在给出一组非负整数 x 和 y,计算 f(x,y) 的值。

Input

第一行:一个整数 T (0 < T <= 100 ),表示有 T 组测试数据。

第 2 行- T+1 行:每行输入两个正整数 x 和 y,(0 ≦x, y ≦1000000 )。两个整数之间有一个空格。

Output

对每组测试数据,输出一行。

int main()
{
    int t,x,y,z,q;
    scanf(“%d”,&t);
    while(t–)
    {
        scanf(“%d %d”,&x,&y);
        z=0;
        for(q=0;q<32;q++)
        {
            if((x%2)!=(y%2))
            z++;
            x>>=1;
            y>>=1;
            }
        printf(“%d\n”,z);
    }
    return 0;
}

 

ECNU OJ 2966 二进制与十六进制

输入一个十进制数 N,将它转换成二进制与十六进制分别输出。

Input

1 行:整数 T (1T10) 为问题数。

2T+1 行:每一个问题中要转换的十进制数 N (0N1 000 000)

Output

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在一行中输出对应的二进制与十六进制,用空格隔开。十六进制中 10A 表示,依次类推。

#include <iostream>
#include <stdio.h>
using namespace std;
int t=0;
char hex_list[36]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
void solve(int num);
int main ()
{
    int T;
    scanf("%d", &T);
    while(T--){
        int num;
        cin >> num;
        solve(num);
    }
}

int convert(int p, int from, int *to)
{
    int i=0;
    do {
        to[i++] = from  % p;
        from /= p;
       
    } while ( from > 0 );

    return i;

}
void solve(int num)
{
    int bin[1000], hex[1000];

    int i = convert(2,num,bin);
    int j = convert(16,num,hex);
    int reverse_bin[1000];
    int reverse_hex[1000];

    printf("case #%d\n", t++); 
    for (int k = 0; k < i; k++){
        reverse_bin[k] = bin[i - k - 1];
    }
    for (int k = 0; k < j; k++){
        reverse_hex[k]= hex[j - k - 1]; 
    }

    for (int k = 0; k < i; k++) cout << reverse_bin[k];
    cout << ' ';
    for (int k = 0; k < j; k++) cout << hex_list[reverse_hex[k]];
    cout << endl;
    
}

 

ECNU OJ 1147 进制转换

输入一个十进制数 N,将它转换成 R 进制数输出。

Input

输入一个正整数 T。表示测试数据的组数。

每个测试实例包含两个整数 N(32 位整数) 和 R (2<=R<=36).

Output

为每个测试实例输出转换后的数,每个输出占一行。如果 R 大于 10,则对应的数字规则参考 16 进制(比如,10 用 A 表示 ,16 用 G 表示等等)。

#include<iostream>
using namespace std;
long int n,r;
char a[36]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int work(long int n)
{
    if(n<r)
    {
       cout<<a[n];
       return n;
    }
    else
    {
       work((n-n%r)/r);
       cout<<a[n%r];
    }
}

void work2(long int n)
{
    int z[100], num=0;
    do {
        z[num++] = n % r;
        n = n / r;
    } while (n != 0);

    for (int i= num - 1; i>=0; i--){
        cout << a[z[i]];
    }

}
int main()
{
    long int t,i,j;
    bool check=0;
    cin>>t;
    for(i=0;i<t;i++)
    {
       check=0;
       cin>>n>>r;
       j=0;
       if(n<0)
       {
         check=1;
         n=-n;
         cout<<'-';
       }
       work2(n);
       cout<<endl;
    }
}

 

ECNU OJ 3053 神秘信息

未来的某一天,人类登陆火星。在火星上发现一组由各种符号表示的神秘信息。研究发现:每种符号表示一个数码,神秘信息是一个整数。但是不知道每个符号表示的是哪个数码,也不知道它是几进制数 (只知道不可能是一进制),但知道相同的符号表示相同的数码,不同的符号表示不同的数码。

符号总计有 62 种,为方便起见,每种符号分别用大小写英文字母和数字 0-9 表示。

现在我们想要知道神秘信息表示的最小整数值。

例如 :

11001001 最小整数值和人类的二进制数一样,为 201;

cats 最小整数值为 75(设是 4 进制数,c 表示 1,a 表示 0,t 表示 2,s 表示 3);

pig 最小整数值为 11(设是 3 进制数,p 表示 1,i 表示 0,g 表示 2)。

注意:神秘信息表示的数必须是有意义的,第一位不能为 0。

Input

第 1 行:整数 T (1T10) 为问题数。

第 2 行:第一个问题的数据。一个字符串表示的神秘信息,长度范围为 [1,60]。

第 3 ∽ T+1 行:后面问题的数据,格式与第一个问题相同。

Output

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在一行中输出神秘信息表示的最小整数值(输入数据保证输出的整数不超过 1018)。

思路:最小的数字为102345….N-1

#include <stdio.h>

int main(void)
{
    char s[61];
    scanf("%s", s);
    int a[128];
    for (int i = 0; i < 128; i++)
        a[i] = -1;  //初始值为-1,表示未出现
    int digit = 0, N = 1; //N进制
    char *p = s;
    a[*p] = 1;
    while (*++p){
        if (a[*p] == -1){ //如果未出现
            a[*p] = digit;
            digit = digit ? digit + 1 : 2; //若digit为0则下一位是2,否则是digit + 1
            N++;
        } 
    if (N < 2) N =2;
    long long ans = 0;
    p = s;
    while (*p)
        ans = ans * N + a[*p++];
    printf("%I64d\n", ans);
    }
}