算法 7.千字文

问题描述

在这里插入图片描述

样例

输入(1)

Qianzi wen in Simplified Chinese
天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏 闰馀成岁 律吕调阳
云腾致雨 露结为霜 金生丽水 玉出昆冈 剑号巨阙 珠称夜光 果珍李柰 菜重芥姜
海咸河淡 鳞潜羽翔 龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐
吊民伐罪 周发殷汤 坐朝问道 垂拱平章 爱育黎首 臣伏戎羌 遐迩一体 率宾归王
鸣凤在竹 白驹食场 化被草木 赖及万方 盖此身发 四大五常 恭惟鞠养 岂敢毁伤
女慕贞洁 男效才良 知过必改 得能莫忘 罔谈彼短 靡恃己长 信使可复 器欲难量
墨悲丝染 诗赞羔羊 景行维贤 克念作圣 德建名立 形端表正 空谷传声 虚堂习听
祸因恶积 福缘善庆 尺璧非宝 寸阴是竞 资父事君 曰严与敬 孝当竭力 忠则尽命
临深履薄 夙兴温凊 似兰斯馨 如松之盛 川流不息 渊澄取映 容止若思 言辞安定
笃初诚美 慎终宜令 荣业所基 籍甚无竟 学优登仕 摄职从政 存以甘棠 去而益咏
乐殊贵贱 礼别尊卑 上和下睦 夫唱妇随 外受傅训 入奉母仪 诸姑伯叔 犹子比儿
孔怀兄弟 同气连枝 交友投分 切磨箴规 仁慈隐恻 造次弗离 节义廉退 颠沛匪亏
性静情逸 心动神疲 守真志满 逐物意移 坚持雅操 好爵自縻 都邑华夏 东西二京
背邙面洛 浮渭据泾 宫殿盘郁 楼观飞惊 图写禽兽 画彩仙灵 丙舍傍启 甲帐对楹
肆筵设席 鼓瑟吹笙 升阶纳陛 弁转疑星 右通广内 左达承明 既集坟典 亦聚群英
杜稿钟隶 漆书壁经 府罗将相 路侠槐卿 户封八县 家给千兵 高冠陪辇 驱毂振缨
世禄侈富 车驾肥轻 策功茂实 勒碑刻铭 磻溪伊尹 佐时阿衡 奄宅曲阜 微旦孰营
桓公匡合 济弱扶倾 绮回汉惠 说感武丁 俊乂密勿 多士寔宁 晋楚更霸 赵魏困横
假途灭虢 践土会盟 何遵约法 韩弊烦刑 起翦颇牧 用军最精 宣威沙漠 驰誉丹青
九州禹迹 百郡秦并 岳宗泰岱 禅主云亭 雁门紫塞 鸡田赤城 昆池碣石 巨野洞庭
旷远绵邈 岩岫杳冥 治本于农 务资稼穑 俶载南亩 我艺黍稷 税熟贡新 劝赏黜陟
孟轲敦素 史鱼秉直 庶几中庸 劳谦谨敕 聆音察理 鉴貌辨色 贻厥嘉猷 勉其祗植
省躬讥诫 宠增抗极 殆辱近耻 林皋幸即 两疏见机 解组谁逼 索居闲处 沉默寂寥
求古寻论 散虑逍遥 欣奏累遣 戚谢欢招 渠荷的历 园莽抽条 枇杷晚翠 梧桐蚤凋
陈根委翳 落叶飘摇 游鹍独运 凌摩绛霄 耽读玩市 寓目囊箱 易輶攸畏 属耳垣墙
具膳餐饭 适口充肠 饱饫烹宰 饥厌糟糠 亲戚故旧 老少异粮 妾御绩纺 侍巾帷房
纨扇圆絜 银烛炜煌 昼眠夕寐 蓝笋象床 弦歌酒宴 接杯举觞 矫手顿足 悦豫且康
嫡后嗣续 祭祀烝尝 稽颡再拜 悚惧恐惶 笺牒简要 顾答审详 骸垢想浴 执热愿凉
驴骡犊特 骇跃超骧 诛斩贼盗 捕获叛亡 布射僚丸 嵇琴阮啸 恬笔伦纸 钧巧任钓
释纷利俗 竝皆佳妙 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑悬斡 晦魄环照
指薪修祜 永绥吉劭 矩步引领 俯仰廊庙 束带矜庄 徘徊瞻眺 孤陋寡闻 愚蒙等诮
谓语助者 焉哉乎也

输出(1)

0x4e91 20x53d1 20x5de8 20x621a 20x6606 20x8d44 2

输入(2)

Qianzi wen in Traditional Chinese
天地玄黃 宇宙洪荒 日月盈昃 辰宿列張 寒來暑往 秋收冬藏 閏馀成歲 律呂調陽
雲騰致雨 露結爲霜 金生麗水 玉齣崑岡 劍號巨阙 珠稱夜光 果珍李柰 菜重芥姜
海鹹河淡 鱗潛羽翔 龍師火帝 鳥官人皇 始制文字 乃服衣裳 推位讓國 有虞陶唐
吊民伐罪 周發殷湯 坐朝問道 垂拱平章 愛育黎首 臣伏戎羌 遐迩一體 率賓歸王
鳴鳳在竹 白駒食場 化被草木 賴及萬方 蓋此身髮 四大五常 恭惟鞠養 豈敢毀傷
女慕貞絜 男效才良 知過必改 得能莫忘 罔談彼短 靡恃己長 信使可複 器欲難量
墨悲絲染 詩贊羔羊 景行維賢 克念作聖 德建名立 形端表正 空谷傳聲 虛堂習聽
禍因惡積 福緣善慶 尺璧非寶 寸陰是競 資父事君 曰嚴與敬 孝當竭力 忠則盡命
臨深履薄 夙興溫凊 似蘭斯馨 如松之盛 川流不息 淵澄取映 容止若思 言辭安定
笃初誠美 慎終宜令 榮業所基 籍甚無竟 學優登仕 攝職從政 存以甘棠 去而益詠
樂殊貴賤 禮別尊卑 上和下睦 夫唱婦隨 外受傅訓 入奉母儀 諸姑伯叔 猶子比兒
孔懷兄弟 同氣連枝 交友投分 切磨箴規 仁慈隱恻 造次弗離 節義廉退 顛沛匪虧
性靜情逸 心動神疲 守真志滿 逐物意移 堅持雅操 好爵自縻 都邑華夏 東西二京
背邙面洛 浮渭據泾 宮殿盤郁 樓觀飛驚 圖寫禽獸 畫彩仙靈 丙舍傍啓 甲帳對楹
肆筵設席 鼓瑟吹笙 升階納陛 弁轉疑星 右通廣內 左達承明 既集墳典 亦聚群英
杜稿鍾隸 漆書壁經 府羅將相 路俠槐卿 戶封八縣 家給千兵 高冠陪辇 驅毂振纓
世祿侈富 車駕肥輕 策功茂實 勒碑刻銘 磻溪伊尹 佐時阿衡 奄宅曲阜 微旦孰營
桓公匡合 濟弱扶傾 绮回漢惠 說感武丁 俊乂密勿 多士寔甯 晉楚更霸 趙魏困橫
假途滅虢 踐土會盟 何遵約法 韓弊煩刑 起翦頗牧 用軍最精 宣威沙漠 馳譽丹青
九州禹迹 百郡秦並 嶽宗泰岱 禅主云亭 雁門紫塞 雞田赤城 昆池碣石 鉅野洞庭
曠遠綿邈 岩岫杳冥 治本於農 務兹稼穑 俶載南畝 我藝黍稷 稅熟貢新 勸賞黜陟
孟轲敦素 史魚秉直 庶幾中庸 勞謙謹敕 聆音察理 鑒貌辨色 贻厥嘉猷 勉其祗植
省躬譏誡 寵增抗極 殆辱近恥 林臯幸即 兩疏見機 解組誰逼 索居閑處 沈默寂寥
求古尋論 散慮逍遙 欣奏累遣 慼謝歡招 渠荷的曆 園莽抽條 枇杷晚翠 梧桐蚤凋
陳根委翳 落葉飄搖 遊鹍獨運 淩摩绛霄 耽讀玩市 寓目囊箱 易輏攸畏 屬耳垣牆
具膳餐飯 適口充腸 飽饫烹宰 饑厭糟糠 親戚故舊 老少異糧 妾禦績紡 侍巾帷房
纨扇圓潔 銀燭炜煌 晝眠夕寐 藍筍象床 弦歌酒宴 接杯舉觞 矯手頓足 悅豫且康
嫡後嗣續 祭祀烝嘗 稽颡再拜 悚懼恐惶 箋牒簡要 顧答審詳 骸垢想浴 執熱願涼
驢騾犢特 駭躍超骧 誅斬賊盜 捕獲叛亡 布射僚丸 嵇琴阮嘯 恬筆倫紙 鈞巧任釣
釋紛利俗 竝皆佳妙 毛施淑姿 工颦妍笑 年矢每催 曦晖朗曜 璇玑懸斡 晦魄環照
指薪修祜 永綏吉劭 矩步引領 俯仰廊廟 束帶矜莊 徘徊瞻眺 孤陋寡聞 愚蒙等诮
謂語助者 焉哉乎也

输出(2)

No repeat!

代码

这个题。。不好调试呀,我觉得应该可以把结果先写到文件里,再转换格式来看看结果?

#include<stdio.h>  
//这道题是T7 千字文   
int main()  
{  
    unsigned char a,b,c;  
    long int repeat[200005] = {},now;  
    int p = 0;  
    while((a = getchar()) != 255)  //这里不能用!=EOF,不然会超时,因为unsigned char 的范围里,EOF是255而不是-1 
    {  
    // 我来简单解释一下这个编码是个怎么回事吧
    // 咱们都知道,一个字节是八个比特位,可以表示0-255之间的整数
    // 但是呢,对于汉字来讲,一个字节肯定是表示不了这么多的汉字,所以需要两个甚至三个字节来表示一个汉字
    // 那这样就会导致一个问题,比如我看到一个两个字节的信息,我怎么知道它是要表示一个汉字还是两个单字节的符号,比如说是两个字母呢?
    // 于是就有了一个很神奇的想法,对于单字节的符号来说,保证我的编码范围是要小于192的(具体是多少我记不清了)
    // 这样的话呢,比如我读入两个字节B1和B2,我可以直接看一下B1的范围,如果B1的范围大于192了,那么肯定就不是一个单字节的字符了
    // 而一定会和后面的B2组成一个双字节的字符
    // 接下来我把这个想法进一步拓展,在原本区分单字节和双字节的基础上再加上三字节
    // 如果B1处于192和223之间,那么就是一个双字节的前半部分,如果大于223,那么就是一个三字节的第一部分,如果小于128,就是一个单字节
    // 这么一看的话,下面的判断是不是就明朗起来了
	
	// 接下来计算的部分中,这个unicode和十进制编码的转换我就不解释了
	// 简单来说就是二进制和十进制的转换
	// 感兴趣可以自己手推一下
        if(a == '\n' || a<128 || a == ' ')  
        {  
            continue;  
        }  
        else if(a >= 192 && a <= 223)  //如果扫描的汉字的UTF-8编码是两个字节 
        {  
            b = getchar();  
            now = (a - 128 - 64) * 64 + (b - 128);  
            repeat[now] ++;  
        }  
        else if(a > 223)  //如果扫描的汉字的UTF-8编码是三个字节 
        {  
            b = getchar();  
            c = getchar();  
            now = (a - 128 - 64 -32) * 4096 + (b - 128) * 64 + (c-128);  
            repeat[now] ++;  
        }  
    }  //这里将所有的UTF-8编码都转变为了十进制的unicode码来存储 
    for(long int i = 0; i < 200000; i++)  
    {  
        if(repeat[i] > 1)  //这里判断这个汉字是不是出现了多于一次 
        {  
            p = 1;  
            if(i > 0 && i <= 2047)  
            {  
                a = i / 64 + 128 + 64;  
                b = i % 64 + 128;  
                printf("%c%c ",a,b);  
                printf("0x%04x ",i);  
                printf("%ld\n",repeat[i]);  
            }  
            if(i > 2047)  
            {  
                a = i / 4096 + 128 + 64 + 32;  
                c = i % 64 + 128;  
                b = (i - (a - 128 - 64 - 32) * 4096 - (c - 128)) / 64 + 128;  
                printf("%c%c%c ",a,b,c);  
                printf("0x%04x ",i);  
                printf("%ld\n",repeat[i]);  
            }  
        }  //将所有的十进制的unicode码再转化为UTF-8编码来进行输出 
    }  
    if(p == 0)  
    {  
        printf("No repeat!\n");  
    }  
    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值